React富文本編輯器開發(三)

現在我們的編輯器顯示的內容很單一,這自然不是我們的目標,讓呈現的內容多元化是我們的追求。這就需要讓編輯器能夠接收多元素的定義。從初始數據的定義我們可以推斷數據的格式遠不止一種,那么其它類型的數據如何定義及呈現的呢,我們新建一個文件elements.jsx,創建一個元素組件:

_elements.jsx

export const CodeElement = props => {return (<pre {...props.attributes}><code>{props.children}</code></pre>)
}

這個組件平常的不能再平常了。就是一個 <pre/>元素。當然我們還要添加一個默認的渲染元素,如下所示:

export const DefaultElement = props => {return <p {...props.attributes}>{props.children}</p>
}

我們要讓這個元素和數據對應起來,修改configure.jsx中的初始化值,添加如下內容:

_configure.jsx

export const initialValue = [{type: 'paragraph',children: [{ text: '這是一行段落文字,內容很少,但很重要!!' }],},{type: 'code',children: [{ text: '這是一代碼行段落文字,內容很少,但很重要!!' }],},
];

我們增加一個code數據段。接下來要做的就是我們要設置一個渲染器, 根據數據類型的不同渲染不同的元素:

const renderElement = useCallback(props => {switch (props.element.type) {case 'code':return <CodeElement {...props} />default:return <DefaultElement {...props} />}}, [])

當然還要把這個渲染器指定給 EditablerenderElement屬性:

<EditablerenderElement={renderElement}onKeyDown={event => {if (event.key === '&') {event.preventDefault()editor.insertText('and')}}}
/>

完整的代碼如下:

SDocer.jsx

import { useState } from 'react';
import { createEditor } from 'slate';
import { Slate, withReact, Editable } from 'slate-react';import { initialValue } from './_configure';
import { CodeElement, DefaultElement } from './_elements';function SDocer() {const [editor] = useState(() => withReact(createEditor()));const renderElement = useCallback(props => {switch (props.element.type) {case 'code':return <CodeElement {...props} />default:return <DefaultElement {...props} />}}, []);return (<Slate editor={editor} initialValue={initialValue}><EditablerenderElement={renderElement}onKeyDown={event => {if (event.key === '&') {event.preventDefault()editor.insertText('and')}}}/></Slate>)
}export default SDocer;

效果如下:
在這里插入圖片描述

現在新的要求來了,我們希望能動態的把選中的段落轉換化<pre>元素,相反也能轉化回默認元素。為了讓兩者的元素有較大的變化,我們對CodeElement元素組件加個樣式,看下面的代碼:

export const CodeElement = props => {return (<pre{...props.attributes}style={{fontSize: "20px",lineHeight: 2,}}><code>{props.children}</code></pre >)
}

然后對 SDocer修改如下:

import { useState, useCallback} from 'react';
import { createEditor, Editor, Transforms, Element } from 'slate';
import { Slate, withReact, Editable } from 'slate-react';import { initialValue } from './_configure';
import { CodeElement, DefaultElement } from './_elements';function SDocer() {const [editor] = useState(() => withReact(createEditor()));const renderElement = useCallback(props => {switch (props.element.type) {case 'code':return <CodeElement {...props} />default:return <DefaultElement {...props} />}}, []);return (<Slate editor={editor} initialValue={initialValue}><EditablerenderElement={renderElement}onKeyDown={event => {if (!event.ctrlKey) return;if (event.key === '`') {event.preventDefault()const [match] = Editor.nodes(editor, {match: n => n.type === 'code',})Transforms.setNodes(editor,{ type: match ? 'paragraph' : 'code' },{ match: n => Element.isElement(n) && Editor.isBlock(editor, n) })}}}/></Slate>)
}export default SDocer;

這樣,如果您按 Ctrl + ' 時光標所在的塊應該會變成一個代碼塊。再次按一次時就變成普通的文本段落。如下所示:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714526.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714526.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于單片機的AGV機器人設計的設計要求

基于單片機的AGV機器人設計的設計要求 1. 引言 本設計要求旨在設計一種基于單片機的自動導航車&#xff08;AGV&#xff09;機器人。AGV機器人可以在工廠、倉庫等場景中進行自動導航、物料搬運等任務。本設計要求包括機器人的硬件設計要求和軟件設計要求兩個方面。 2. 硬件設…

(Aliyun AI ACP 02)阿里云人工智能產品體系

文章目錄 阿里云人工智能工程師ACP認證考試知識點輔助閱讀&#xff08;Aliyun AI ACP 02&#xff09;阿里云人工智能產品體系引言阿里云AI產品總體架構基礎設施層&#xff1a;平臺層&#xff1a;算法與模型層&#xff1a;應用層&#xff1a;組成部分詳述&#xff1a;PAI產品家族…

手把手教你免費用Flashduty做消息通知

為什么需要消息通知&#xff1f; 如果有重要的情況發生&#xff0c;希望能通過各種媒介通知我們。可以舉幾個例子&#xff1a; 家里燃氣費沒有了&#xff0c;希望能有短信或者app通知api頻繁500報錯&#xff0c;希望及時感知&#xff0c;及時修復公司網站是https自簽名證書&a…

白話大模型① :AI分析能做什么?在實際落地中會碰到什么問題?

白話大模型系列共六篇文章&#xff0c;將通俗易懂的解讀大模型相關的專業術語。本文為第一篇&#xff1a;AI分析能做什么&#xff1f;在實際落地中會碰到什么問題&#xff1f; 作者&#xff1a;星環科技 人工智能產品部 我們使用一個簡單的應用實例來解析人工智能分析都在做什…

若依框架使用mars3d的環境配置,地球構建

因項目需要&#xff0c;原本使用過的cesium依賴&#xff0c;現在想使用火星科技mars3d的一些功能&#xff0c;所以需要引入mars3d依賴&#xff0c;整個過程非常的坎坷&#xff0c;以至于我都不知道到底是哪些部分是標準的。。。先把我認為對的記錄一下&#xff1a; 1.vue.conf…

[滲透教程]-200-網絡安全基本概念

文章目錄 1.0專業術語1.1資產1.2網絡安全 (cyber security)1.3 網絡空間 (cyberspace)1.4安全的屬性1.5 安全策略1.6 威脅模型1.7 威脅模型1.8 DREAD模型1.9 OCTAVE模型1.10 國內的安全2.安全策略(Security Policy)3.安全機制(Security Mechanism)4. 安全防護模型

sqlserver保存微信Emoji表情

首先將數據庫字段&#xff0c;設置類型為 nvarchar(200)一個emoji表情&#xff0c;占4字節就可以了&#xff0c;web前端展示不用改任何東西&#xff0c;直接提交數據保存&#xff1b;回顯也會沒有問題&#xff0c;C#代碼不用做任何處理&#xff1b; 不哭不鬧要睡覺&#x1f31…

【機器學習300問】24、模型評估的常見方法有哪些?

一、為什么要對模型進行評估&#xff1f; 對機器學習和神經網絡的模型進行評估是至關重要的&#xff0c;原因如下&#xff1a; 得知模型的泛化能力 模型評估的主要目的是了解模型在未見過的數據上的表現&#xff0c;即其泛化能力。這是因為模型的性能在訓練數據上可能會過擬合…

構建大語言模型的四個主要階段

大規模語言模型的發展歷程雖然只有短短不到五年的時間&#xff0c;但是發展速度相當驚人&#xff0c;國內外有超過百種大模型相繼發布。中國人民大學趙鑫教授團隊在文獻按照時間線給出 2019 年至 2023 年比較有影響力并且模型參數量超過 100 億的大規模語言模型。大規模語言模型…

LangFlow——一款可輕松實驗和原型化 LangChain流水線的AI項目

LangFlow——一款可輕松實驗和原型化 LangChain流水線的AI項目。 前言 在人工智能興起的當下&#xff0c;AI正在重塑著很多行業。今天介紹的是一款近期登上github熱門的一款可輕松實驗和原型化 LangChain[1] 流水線的AI項目—LangFlow。 Flowise——通過拖放界面構建定制的LLM…

MCTP Control Protocol

MCTP control message用于在MCTP通信的協議中&#xff0c;來設置和初始化MCTP通信。 本文基于 SMBus/I2C 來實現 MCTP Control Protocol&#xff0c;SMBus/I2C 包格式如下&#xff1a; Management Component Transport Protocol (MCTP) SMBus/I2C Transport Binding Specific…

Flask學習筆記

不論POST請求還是GET請求都支持在 URL 中添加變量&#xff0c;可以選擇性的加上一個轉換器&#xff0c;為變量指定數據類型。 history_alarm.route(/test/<int:post_id>, methods[POST]) def test(post_id):print(f"參數類型為&#xff1a;{type(post_id)}")i…

VUE3中的組件傳值

一、父傳子(props) 在子組件中可以使用defineProps接收父組件向子組件的傳值 父組件fatherPage.vue&#xff1a; <template><div class"father"><button click"a a 1">按鈕</button><childPage :a"a" /><…

clickhouse的多路徑存儲策略

存儲策略 clickhouse從19.15開始&#xff0c;MergeTree實現了自定義存儲策略的功能&#xff1a; JBOD策略&#xff1a;這種策略適合服務器掛多磁盤但沒做raid的場景。JBOD是一種輪詢策略&#xff0c;每次執行INSERT或者MERGE&#xff0c;所以產生的新分區會輪詢寫入各個磁盤。…

C#面:Application , Cookie 和 Session 會話有什么不同

Application、Cookie 和 Session 是在Web開發中常用的三種會話管理方式 Application&#xff08;應用程序&#xff09;&#xff1a; Application 是在服務器端保存數據的一種方式&#xff0c;它可以在整個應用程序的生命周期內共享數據。Application 對象是在應用程序啟動時創…

Nginx 隱藏版本信息和logo

1.隱藏版本信息 http {### 隱藏版本號 server_tokens off; } 2.隱藏圖標 2.1 cd nginx 安裝的路徑 cd/XXXX/nginx-1.2.0 2.2 編輯文件 vim src/core/nginx.h 修改define nginx_ver 中的內容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

java 基礎(核心知識搭配代碼)

前言 java的學習分為了上部分以及下部分進行學習&#xff0c;上部分就是對于java的基礎知識&#xff0c;面向對象上&#xff0c;面向對象下&#xff0c;異常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…

Grid-Based Continuous Normal Representation for Anomaly Detection 論文閱讀

Grid-Based Continuous Normal Representation for Anomaly Detection 論文閱讀 摘要簡介方法3.1 Normal Representation3.2 Feature Refinement3.3 Training and Inference 4 實驗結果5 總結 文章信息&#xff1a; 原文鏈接&#xff1a;https://arxiv.org/abs/2402.18293 源碼…

ChatGPT4.0使用次數限制解讀

ChatGPT4.0使用次數限制解讀 ChatGPT4.0簡介 ChatGPT4.0&#xff0c;由OpenAI開發的先進通用聊天機器人模型&#xff0c;基于GPT4技術構建&#xff0c;為用戶提供了自然語言處理等多項任務的解決方案。 ChatGPT4.0使用次數限制 在日常使用過程中&#xff0c;用戶會遇到Chat…

【MIT 6.S081】2020, 實驗記錄(6),Lab: Copy-on-Write Fork

目錄 Task: Implement copy-on writestep 1&#xff1a;對內存塊進行引用計數step 2&#xff1a;uvmcopy 實現 fork 時將 parent 的物理頁映射到 child 中step 3&#xff1a;在 usertrap 中增加對 page fault 的處理執行測試 官方說明&#xff1a;Lab: Copy-on-Write Fork for …