React富文本编辑器开发(五)

到目前为止我们所有的功能操作都是直接写在 onKeydown 事件里了,但如果我想复用相同的功能怎么办呢,最好的办法就是拨离了,下面我就形如进行这样的操作,把相关的可复用的命令操作抽取出来。

新建文件 _helper.jsx,创建一个协助器

import { Editor, Transforms, Element } from "slate"export const Helper = {// 判断当前是否是粗体状态isBoldMarkActive(editor) {const marks = Editor.marks(editor)return marks ? marks.bold === true : false},// 判断当前是否是code状态isCodeBlockActive(editor) {const [match] = Editor.nodes(editor, {match: n => n.type === 'code',})return !!match},// 切换粗体toggleBoldMark(editor) {const isActive = Helper.isBoldMarkActive(editor)if (isActive) {Editor.removeMark(editor, 'bold')} else {Editor.addMark(editor, 'bold', true)}},// 切换codetoggleCodeBlock(editor) {const isActive = Helper.isCodeBlockActive(editor)Transforms.setNodes(editor,{ type: isActive ? 'paragraph' : 'code' },{ match: n => Element.isElement(n) && Editor.isBlock(editor, n) })},
}

这里我们对SDocer.jsx进行修改:

SDocer.jsx

import { useState, useCallback } from 'react';
import { createEditor, Editor, Transforms, Element } from 'slate';
import { Slate, withReact, Editable } from 'slate-react';import { initialValue } from './_configure';
import { renderElement } from './_elementRender';
import { renderLeaf } from './_leafRender';
import { Helper } from './_helper';function SDocer() {const [editor] = useState(() => withReact(createEditor()));return (<Slate editor={editor} initialValue={initialValue}><EditablerenderElement={useCallback(renderElement, [])}renderLeaf={useCallback(renderLeaf, [])}onKeyDown={event => {if (!event.ctrlKey) return;switch (event.key) {case '`': {event.preventDefault()Helper.toggleCodeBlock(editor);break}case 'b': {Helper.toggleBoldMark(editor);break}}}}/></Slate>)
}export default SDocer;

这样代码也清爽了许多,功能我们也抽取出来了,这为我们日后的工具栏的设计创建了基础。效果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏引擎渲染流程

一、渲染概述 我们首先看到渲染技术的发展 游戏渲染面临的挑战&#xff1a; 一个容器中同一时刻有大量的游戏对象需要进行渲染&#xff0c;并且不同对象渲染的形式、算法还有所差异&#xff0c;这些使得游戏的绘制系统变得非常复杂&#xff1b;其次&#xff0c;游戏引擎的渲染…

空间直角坐标系、大地坐标系、平面坐标系介绍

空间直角坐标系、大地坐标系、平面坐标系 2017-04-11 13:53 ( 一)空间直角坐标系 空间直角坐标系的坐标原点位于参考椭球的中心,Z轴指向参考椭球的北极,X轴指向起始子午面与赤道的交点,Y轴位于赤道面上切按右手系于X轴呈90度夹角,某点中的坐标可用该点在此坐标系的各…

【深度学习】目标检测神经网络1/2

目标检测神经网络 概念 模型分类有三种&#xff1a;图像分类即输出图像类别和概率&#xff1b;单目标检测&#xff0c;输出目标的概率和位置&#xff1b;多目标检测&#xff0c;同时输出多个目标的分类、位置、概率。 位置检测分为两种形式&#xff1a;一种是矩形框&#xf…

如何分辨Mac设备X86或ARM

在终端中输入如下命令可以获取到当前 Mac 设备是 X86 还是 ARM 类型 uname -a 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

Vue响应式内容丢失处理

对数组和对象进行不当的修改会使Vue的对象丢失响应式&#xff0c;这时可以直接console.log丢失的对象&#xff0c;看是否有getter和setter 对于数组和对象&#xff0c;只有使用 Vue 提供的一些方法&#xff08;如 push()、pop()、splice()、set() 等&#xff09;进行修改才会触…

linux循环之for循环

1.循环介绍 循环就是迭代(重复)一些命令的代码块&#xff0c;如果循环控制条件不满足的话&#xff0c;就结束循环 2.for循环语法 for 循环控制条件 do commands done #当“循环控制条件”不满足条件&#xff0c;结束for循环 3.for循环样例 [rootkibana ~]# cat for-1.…

css深度选择器 /deep/ 在89版本后就失效了

css深度选择器 /deep/ 在89版本后就失效了 前言&#xff1a;在高版本中&#xff08;89版本以后&#xff09;css使用/deep/样式就失效了 原因&#xff1a;css深度选择器 /deep/ 在89版本后就不支持了 解决办法&#xff1a;使用scss预编译 <style lang"scss" sc…

DxO PureRAW:赋予RAW图像生命,打造非凡视觉体验 mac/win版

DxO PureRAW 是一款专为RAW图像处理而设计的软件&#xff0c;旨在帮助摄影师充分利用RAW格式的优势&#xff0c;实现更加纯净、细腻的图像效果。该软件凭借其强大的功能和易于使用的界面&#xff0c;成为了RAW图像处理领域的佼佼者。 DxO PureRAW 软件获取 首先&#xff0c;Dx…

几种电脑提示mfc140.dll丢失的解决方法,以及如何预防mfc140.dll丢失

mfc140.dll真是一个超级关键的动态链接库文件&#xff01;一旦这个文件不翼而飞&#xff0c;可能会导致一些程序无法顺利运行&#xff0c;甚至给系统带来麻烦。但别担心&#xff01;遇到mfc140.dll文件丢失的情况&#xff0c;我们有一堆应对措施可以立马施行&#xff0c;确保问…

计算机网络-物理层

物理层 基本概念传输媒体信道复用频分复用&#xff08;FDM&#xff09;时分复用&#xff08;TDM&#xff09;波分复用&#xff08;WDM&#xff09;码分复用&#xff08;CDM&#xff09; 宽带接入技术ADSL技术光纤同轴混合网(HFC网)FTTx技术 数据通信常识 上次我们已经大致学习了…

探秘Netty:打造高性能网络通信利器

目录 Netty真强大啊&#xff01;TCP拆包与粘包长连接握手认证心跳机制断线重连机制消息重发机制读写超时机制离线消息线程池结语感谢您的阅读&#xff01; Netty真强大啊&#xff01; Netty是一个基于Java的异步事件驱动的网络应用框架&#xff0c;被广泛应用于高性能、高可靠…

06 - 镜像管理

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

【探索AI】二十五 深度学习之第8周:深度学习项目实战

项目名称&#xff1a;基于深度学习的图像分类系统 一、项目背景 随着大数据和人工智能技术的快速发展&#xff0c;图像分类技术在各个领域得到了广泛应用&#xff0c;如安防监控、医疗诊断、自动驾驶等。本项目旨在利用深度学习技术构建一个高效的图像分类系统&#xff0c;实…

C++高级面试题:请解释 C++ 中的递归模板(Recursive Templates)

请解释 C 中的递归模板&#xff08;Recursive Templates&#xff09; 递归模板&#xff08;Recursive Templates&#xff09;是一种使用模板递归定义的技术&#xff0c;在编译时生成具有不同结构的代码。这种技术通常用于处理数据结构或实现算法&#xff0c;其中需要对数据进行…

Mysql数据迁移3个快速方法与数据库恢复

目录 Mysql数据迁移3个快速方法与数据库恢复 方法1 选中表复制粘贴 方法2 克隆 方法3 DTS迁移【推荐】 数据库误删恢复方法 Mysql数据迁移3个快速方法与数据库恢复 前言&#xff1a;日常开发中&#xff0c;项目测试发布到生产或者复制多一套程序出来&#xff0c;经常免不…

QT C++实践| 连接数据库的登录界面实现| 附源码

前言 在之前的两篇博客中QT C实战&#xff1a;实现用户登录页面及多个界面跳转、QT C实践|超详细数据库的连接和增删改查操作|附源码分别详细讲解了&#xff1a;登录界面的制作&#xff08;UI布局、页面跳转、登录逻辑等&#xff09;、QT如何连接Mysql数据库&#xff0c;并进行…

node的概念

node和浏览器有什么区别和联系&#xff0c;及node进行服务端开发的本质 Node.js和浏览器在JavaScript运行环境方面存在一些区别和联系。 区别&#xff1a; 运行环境&#xff1a;Node.js是一个服务器端JavaScript运行环境&#xff0c;而浏览器是一个客户端JavaScript运行环境…

EPSON RA8000CE (RTC模块)压电侠

RA8000CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块。它包括各种功能&#xff0c;如具有闰年校正的秒到年时钟/日历&#xff0c;时间警报&#xff0c;唤醒计时器&#xff0c;时间更新中断&#xff0c;时钟输出和时间戳功能&#xff0c;可以在外部或内部事件…

C++--调整数组顺序使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有的奇数位于数组的前半部分&#xff0c;所有的偶数位于数组的后半部分&#xff0c;并保证奇数和奇数&#xff0c;偶数和偶数之间的相对位置不变。 方法一&#xff1a; …

2024年最新苹果cms MXoneV10 10.8版本模板独家

2024年最新苹果cms MXoneV10 10.8版本模板独家 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88891237 更多资源下载&#xff1a;关注我。