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.mzph.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 …