当前位置: 首页 > news >正文

React富文本编辑器开发(七)接口与辅助函数

接口

我们知道Slate使用纯 JSON 数据对象,只要这些数据符合接口标准就行。也就是说每一个节点都有一个接口标准与之对应。比如文本节点:

interface Text {text: string
}

在实例这些接口数据的同时我们也可以增加额外的属性,这根据我们的实际设计需求而定。增加的属性不会妨碍Slate的解析。比如,Element节点的接口标准是下面这样的:

interface Element {children: Node[]
}

针对这样一个宽松的接口,我们施展的空间就很大了。比如 :

const paragraph = {type: 'paragraph',children: [...],
}const link = {type: 'link',url: 'https://example.com',children: [...]
}

上面的代码中,我们增加了 type属性,在 link中还增加了url属性,根据link的数据定义,我们就能够很容易的渲染成下面的元素:

<a href={element.url}>{element.children}</a>

辅助工具

Slate 中提供了很多的辅助函数,这大大方便了我们的使用。比如下面,在使用节点的过程中我们可能需要用到:

import { Node } from 'slate'// 获取元素节点内的字符内容
const string = Node.string(element)// 在一个根节点中获取指定位置的节点
const descendant = Node.get(value, path)

在使用范围时可能会用到下面的工具:

import { Range } from 'slate'// 按顺序获取选择范围的起点和终点
const [start, end] = Range.edges(range)// 检查一个选择范围是否被折叠。即一个光杆插入点,没有选择内容,起点和终点在一起。
if (Range.isCollapsed(range)) {// ...
}

所以,在正式开发之前先了解一下相关的辅助工具是很有必要的。

自定义辅助工具

除了使用Slate提供的这辅助工具外,我们当然也可以自定义一些工具,比如下面这个判断一个元素是否是图像元素的工具:

const isImageElement = element => {return element.type === 'image' && typeof element.url === 'string'
}

然后把它们绑定的系统命名空间中去,以后使用就相当的方便了

import { Element } from 'slate'export const MyElement = {...Element,isImageElement,isParagraphElement,isQuoteElement,
}

相关文章:

React富文本编辑器开发(七)接口与辅助函数

接口 我们知道Slate使用纯 JSON 数据对象&#xff0c;只要这些数据符合接口标准就行。也就是说每一个节点都有一个接口标准与之对应。比如文本节点&#xff1a; interface Text {text: string }在实例这些接口数据的同时我们也可以增加额外的属性&#xff0c;这根据我们的实际…...

【conda】conda卸载并重新安装指定版本软件package

1. conda卸载软件包 可先通过 conda list 查看已当前环境已安装的软件包 conda uninstall your_package如果卸载失败, 可通过pip卸载 pip uninstall your_package2. 安装指定版本的软件包 先搜索可安装的软件包版本, 如 conda search --full-name protobuf再安装对应的软件版本…...

项目设计方案规范参考

在软件架构设计中&#xff0c;以下是一个常见的软件架构设计模版&#xff0c;供参考&#xff1a; 1. 业务需求分析 确定系统的业务需求和功能需求。 分析用户需求&#xff0c;确定系统的核心功能和非功能需求。 2. 架构设计原则 SOLID 原则&#xff08;单一职责、开放封闭、里…...

LVS----DR模式

一、LVS-DR工作原理 1、LVS-DR数据包流向分析 客户端发送请求到Director Server (负载均衡器)&#xff0c;请求的数据报文&#xff08;源IP是CIP&#xff0c;目标IP是VIP&#xff09;到达内核空间。Director Server 和Real Server 在同一个网络中&#xff0c;数据通过二层数据…...

操作系统(笔记)(一)

1、操作系统的功能和目标 1.1功能 存储管理文件管理设备管理处理机管理进程管理 1.2目标 方便性&#xff1a;操作系统作为用户与计算机硬件系统之间的接口&#xff0c;提供了直观的命令和界面&#xff0c;使得用户能够更容易地操作计算机。有效性&#xff1a;操作系统旨在提…...

Redis线程模型解析

引言 Redis是一个高性能的键值对&#xff08;key-value&#xff09;内存数据库&#xff0c;以其卓越的读写速度和灵活的数据类型而广受欢迎。在Redis 6.0之前的版本中&#xff0c;它采用的是一种独特的单线程模型来处理客户端的请求。尽管单线程在概念上似乎限制了其扩展性和并…...

ros2 launch如何控制node的启动顺序

ros2 launch如何控制node的启动顺序 文章目录 引言如何写launch文件启动流程图具体launch代码总结引言 本文用来说明如何控制ros2 launch 节点的先后顺序,我们有时候需要一个节点启动完成后再启动其它节点,实现这个功能有两种方式: 在launch.py时写event根据事件触发使用li…...

Android13 framework层添加关机接口

framework层修改&#xff1a; t0_sys/frameworks/base/core/api/current.txt method RequiresPermission(android.Manifest.permission.REBOOT) public void reboot(Nullable String);method public void rebootp();t0_sys/frameworks/base/core/java/android/os/IPowerManager…...

GDB调试入门笔记

文章目录 What&#xff1f;WhyHow安装GDB安装命令查看是否安装成功调试简单的程序预备一个程序调试 使用breakinfolistnextprintstep一些小技巧在gdb前shell日志功能watch point| catch point 调试core调试一个运行的程序 What&#xff1f; GDB是什么&#xff1f; 全称GNU sym…...

JavaScript的`call`方法:实现函数间的调用!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

qt5-入门-使用拖动方式创建Dialog

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 实现效果基本流程逐步实操1&#xff09;创建和初始化子部件2&#xff09;把子部件放进布局中3&#xff09;设置tab顺序4&#xff09…...

【Redis】RedisTemplate和StringRedisTemplate的区别

两者的关系是 StringRedisTemplate 继承 RedisTemplate 。 两者的数据是不共通的&#xff1a;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据&#xff0c;RedisTemplate 只能管理 RedisTemplate 中的数据。 RedisTemplate 看这个类的名字后缀是 Temp…...

面试经典150题(101-104)

leetcode 150道题 计划花两个月时候刷完之未完成后转&#xff0c;今天&#xff08;第1天&#xff09;完成了4道(101-104)150&#xff1a; 101.(215. 数组中的第K个最大元素) 题目描述&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请…...

Java实现读取转码写入ES构建检索PDF等文档全栈流程

背景 之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo&#xff0c;并已实现WebHook的搭建和触发流程接口。 传送门&#xff1a; 基于GitBucket的Hook构建ES检索PDF等文档全栈方案 使用ES检索PDF、word等文档快速开始 实现读取本地文件入库ES 总体思路&…...

主流开发环境和开发语言介绍

主流开发环境和开发语言介绍 一、主流开发环境介绍 主流开发环境是指广泛应用于软件开发的集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;。IDE是一种集成了编辑器、编译器、调试器等工具的软件&#xff0c;提供了一站式的开发环…...

C++ 使用 nlohmann::json存储json文件

C 使用 nlohmann::json存储json文件 nlohmann::json 概述JSON 存储的示例以追加的方式存储json文件 nlohmann::json 概述 nlohmann::json 是 C 中一个流行的 JSON 库&#xff0c;由 Niels Lohmann 开发。它提供了一个简单而强大的 API&#xff0c;用于解析、构建、操作和序列化…...

何为OOM(Out of Memory)?

OOM&#xff08;Out of Memory&#xff09; 是指程序运行过程中内存不足的情况。在 Spark 应用程序中&#xff0c;OOM 是一个非常常见的问题&#xff0c;尤其是在处理大规模数据集或执行资源密集型的操作时。当 Spark 作业尝试使用的内存超过了为其分配的内存限制时&#xff0c…...

SpringBoot+Mybatis-plus+shardingsphere实现分库分表

SpringBootMybatis-plusshardingsphere实现分库分表 文章目录 SpringBootMybatis-plusshardingsphere实现分库分表介绍引入依赖yaml配置DDL准备数据库ds0数据库ds1 entitycotrollerserviceMapper启动类测试添加修改查询删除 总结 介绍 实现亿级数据量分库分表的项目是一个挑战…...

FPGA DDR3简介及时序

一&#xff0c;DDR3基础知识 1、DDR3全称第三代双倍速率同步动态随机存储器。 特点:①掉电无法保存数据&#xff0c;需要周期性的刷新。 ②时钟上升沿和下降沿都会传输数据。 ③突发传输,突发长度Burst Length一般为8 2、DDR3的存储: bank、行地址和列地址 数据怎么存入到D…...

java网络编程 02 socket

01.socket定义 02.TCP编程 import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;public class clientSocket {public static void main(String[] args) throws IOException {Socket socket new Socket(Ine…...

3步学会BilibiliDown:零基础掌握B站视频下载的终极指南

3步学会BilibiliDown&#xff1a;零基础掌握B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

InternLM2-Chat-1.8B多场景落地:跨境电商产品描述生成+多语言翻译实战

InternLM2-Chat-1.8B多场景落地&#xff1a;跨境电商产品描述生成多语言翻译实战 1. 跨境电商的痛点与AI解决方案 跨境电商卖家每天面临着一个共同的挑战&#xff1a;如何为成千上万的商品快速生成高质量的产品描述&#xff0c;并且还要满足不同语言市场的需求。传统的人工撰…...

STM32新手避坑:用Keil5和SSD1306 OLED显示自定义汉字(解决中文乱码)

STM32实战指南&#xff1a;Keil5与SSD1306 OLED的汉字显示优化全解析 刚接触STM32开发的工程师们&#xff0c;在完成基础的点灯实验后&#xff0c;往往迫不及待想尝试更丰富的显示功能。SSD1306 OLED屏幕因其小巧的体积和清晰的显示效果&#xff0c;成为许多项目的首选。但当涉…...

typedef用法

将为你介绍typedef 4 种应用方式。应用一、为基本数据类型定义新的类型名用uint32_t替代unsigned int声明变量/* 变量名重定义 */typedef unsigned int uint32_t;/* 定义一个unsigned int类型的变量 */uint32_t count 0;应用二、为自定义数据类型&#xff08;结构体、共用体和…...

如何从碎片化信息中构建系统性科研认知?

在科研工作中&#xff0c;我们常常面临这样一种困境&#xff1a;每天通过各种渠道接触到海量的学术信息&#xff0c;这些信息如同散落的拼图碎片&#xff0c;虽然珍贵&#xff0c;却难以自动拼凑成一幅完整的画面。对于许多科研人员而言&#xff0c;难以形成系统认知是一个巨大…...

3步终结C盘爆红:WindowsCleaner革新性磁盘清理工具高效释放空间

3步终结C盘爆红&#xff1a;WindowsCleaner革新性磁盘清理工具高效释放空间 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 问题剖析&#xff1a;你是否正遭遇这些…...

Qt实战:QGroupBox和QButtonGroup的5个实用技巧(附完整代码)

Qt实战&#xff1a;QGroupBox和QButtonGroup的5个实用技巧&#xff08;附完整代码&#xff09; 在Qt界面开发中&#xff0c;QGroupBox和QButtonGroup是两个看似简单却暗藏玄机的组件。很多开发者只停留在基础使用层面&#xff0c;却不知道它们能实现更复杂的交互逻辑和界面优化…...

igel高级功能解析:交叉验证与模型评估最佳实践

igel高级功能解析&#xff1a;交叉验证与模型评估最佳实践 【免费下载链接】igel a delightful machine learning tool that allows you to train, test, and use models without writing code 项目地址: https://gitcode.com/gh_mirrors/ig/igel igel是一个让机器学习变…...

AsyncAPI通道管理终极指南:如何高效组织消息流的关键技巧

AsyncAPI通道管理终极指南&#xff1a;如何高效组织消息流的关键技巧 【免费下载链接】spec The AsyncAPI specification allows you to create machine-readable definitions of your asynchronous APIs. 项目地址: https://gitcode.com/gh_mirrors/spec/spec AsyncAPI…...

如何借助内网穿透工具实现WinSCP跨系统远程文件管理的稳定连接

1. 为什么需要内网穿透实现WinSCP远程文件管理 作为开发者或运维人员&#xff0c;我经常需要在Windows和Linux服务器之间传输文件。最初我尝试用U盘或网盘中转&#xff0c;但效率太低&#xff1b;后来改用WinSCP直连局域网&#xff0c;又遇到跨地域办公的难题。直到发现内网穿透…...