Lexical 可以轻松创建复杂的文本编辑体验,否则使用内置浏览器工具会非常复杂,比如可以用来构建这些:
Lexical 具有以下特点:
支持以下浏览器:
项目地址:
https://github.com/facebook/lexical
编辑器实例是将所有东西连接在一起的核心,可以将 contenteditable DOM 元素附加到编辑器实例上,注册和监听命令,更重要的是,编辑器允许更新其自身的 EditorState。
// 创建编辑器实例
createEditor()
编辑器状态表示你希望在 DOM 上显示的内容的底层数据模型,包含两部分:
editor.update(() => {...})
可以将节点转换或命令处理程序作为钩子挂到 update 方法中,它们将作为更新流程的一部分而被调用,以防止更新的级联/瀑布式更新。
// 获取当前编辑器状态
editor.getEditorState()
// 编辑器状态可以被序列化成 JSON,通过该方法将 JSON 转换回实例对象
editor.parseEditorState()
如果想要更改编辑器状态中的某些内容,必须通过更新操作来完成:
editor.update(() => {...})
传递给更新调用的闭包很重要,这是一个拥有活动中编辑器状态完整上下文的地方,它公开了对底层编辑器状态节点树的访问。
Lexical 有自己的 DOM 协调器,它采用一组编辑器状态(总是“当前”和“待定”)并在它们上应用“差异”。然后它使用此差异仅更新 DOM 中需要更改的部分,可以将其视为一种虚拟 DOM,使得 Lexical 能够跳过许多差异比较工作,因为它知道在给定更新中发生了哪些变化。
除了调用更新之外,使用 Lexical 完成的大部分工作是通过监听器、节点转换和命令完成的。这些操作都来自编辑器实例,以 register 开头。另一个重要特性是所有注册方法都返回一个函数以轻松取消订阅它们。
const unregisterListener = editor.registerUpdateListener(({editorState}) => {
console.log(editorState);
});
unregisterListener();
命令是用于将 Lexical 中的所有内容链接到一起的通信系统,当按键被触发或其他重要信号出现时,语法在内部调度命令,传入的命令按优先级通过所有处理程序进行传播,类似于浏览器的时间传播机制
// 创建自定义命令
createCommand()
// 发送到编辑器实例
editor.dispatchCommand(command, payload)
// 也可以直接注册命令
editor.registerCommand(handler, priority)
这个例子可以用来创建一个简单的富文本编辑器:
import "./styles.css";
import Editor from "./Editor";
export default function App() {
return (
Rich Text Example
Note: this is an experimental build of Lexical
Other Examples
);
}
新闻名称:9.6K Star!可扩展的富文本编辑框架!
链接URL:http://www.shufengxianlan.com/qtweb/news17/318167.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联