raftjs在知乎的实践漫思

例如,初始化一个自定义快捷键功能的富文本编辑器,使用非 React 编辑器,可能需要这么写:

或者更加原始的写法:

试着运行一下上面的例子,就会发现页面上呈现的是一块可编辑的区域,而不像传统的富文本编辑器(比如 TinyMCE),渲染出一个带有工具栏的输入框。如果我们给 Editor 传入 readOnly 属性,Editor 就会变成一个纯粹的富文本渲染组件,可以用来渲染一篇文章。只要传入 EditorState 类型对象作为输入,Editor 组件就能渲染其中的富文本内容 。Editor 组件同时也包含一系列响应用户操作的接口如 onChange,以及用于操作 EditorState 对象的工具函数/类。真正是富文本编辑器的应该是我们封装后的 MyEditor 组件。

很容易猜测出其中一些属性的含义,比如 undoStack/redoStack 是「撤销/重做」栈,selection 标识当前的选区,lastChangeType 记录最后一次变更操作的类型。EditorState 提供一系列实例方法来获取和操作这些属性。

这里的核心是 currentContent 属性,currentContent 是 ContentState 类型的对象,ContentState规定了如何存储具体的富文本内容,包括文字、块级元素、行内样式、元数据等。

在浏览器里打印下图所示的内容经过 convertToRaw 转化的结果:

可以看到的是输出的对象有一个名为 blocks 的属性,blocks 是一个数组,每一项代表当前内容中的一个块级元素。

blocks 的第一项 type 是 'unstyled',代表一个普通的段落,text 属性存储文字内容,inlineStyleRanges 也是一个数组,它的第一项表明该块级元素第 7 个位置被添加了 'BOLD' 样式,样式长度为 5,因此,这一行文本的第 8 到第 12 个字符被添加了加粗的行内样式。

富文本内容的结构化存储一个显而易见的好处是表现力更强

以用 Python 判断富文本中有没有图片为例。用传统的 HTML 方式存储富文本:

富文本内容的结构化存储的另一个好处是内容的存储和渲染逻辑分离

分离能够带来更高的灵活性

存储和渲染的逻辑分离更容易保证渲染结果的确定性

以一段既加粗又倾斜的文本为例,对于一般的基于 HTML 存储的富文本编辑器,如果先倾斜后加粗,很可能得到这个结果:

如果先加粗后倾斜,则是:

内容的存储和渲染逻辑分离带来的另一个可能的好处是多端复用

比如在 app 端做原生渲染,结构化数据比 HTML 更利于解析。

通过 blockRendererFn 自定义渲染当前 block 的方式,例如指定调用 Media 组件去渲染 type 为 atomic 的 block,当前 block 会被注入到组件的 props 中:

keyBindingFn 和 handleKeyCommand 用于定义键盘事件的处理方式,下面是一个快捷键切换到 readOnly 模式的例子:

entity 具有 type 和 data,值得注意的是 entity 还有一个取值为 'Immutable'、'Mutable' 或 'Segmented' 的 mutability 属性,这个属性规定着对应着 entity 的文本将如何被修改/删除。典型的场景是 mention,@xxx 中一旦有一个字符被修改或删除,mention 应该整体被移除或替换,否则就会出现 @ 的名字和实际 @ 的用户不一致的情形,因此,mention 这种类型的 entity 应该被声明为 'Immutable'。

类似又不同于 blockRendererFn 自定义 block 的渲染,decorator 支持定义 block 内符合某种条件的文本的渲染,strategy 函数负责描述找到这段文本的方式,在这里是找到所有对应类型为 mention 的 entity 的文字,然后用 Mention 组件进行渲染。

以及没有提到的:

通过 Entity、Decorator、插件机制的配合,我们可以比较简单地实现一个小的功能插件,比如把粘贴进编辑器的链接自动替换为该链接对应网页的标题,我把它命名为 LinkTitlePlugin:

较保守的方案:draft2HTML,存 HTML

Pros:

Cons:

较激进的方案:HTML2draft,存 draft

Pros:

Cons:

一次尝试

考虑到转换老数据的风险和协同各端适配新数据格式的成本,决定先不做数据存储层面的改动。恰巧的是提问功能只涉及到数据的增而不涉及到数据的修改,偏向保守的第一个方案可以满足知乎新版 Web 个人页的需求,同时把改版的风险和成本降到最低。

决定方案以后我们做了以下三件事来完成提问功能:

下一步

当然,在未来我们不可避免地会涉及到数据(比如提问、回答)的修改。因此在上一步的基础之上,我们去实现 HTML2draft 函数,支持新老数据在新编辑器中的修改。同样出于成本和风险的考虑,我们打算继续不改变数据存储的方式。HTML 字符串从数据库出来,转换为 ContentState 对象传入编辑器,编辑完毕后重新转换回 HTML 存入数据库,两种格式的相互转换在浏览器端进行。

THE END
0.数据倾斜产生,原因及其解决方案产生数据倾斜的原因第七章 数据倾斜 7.1 数据倾斜的产生,表现与原因 7.1.1 数据倾斜的定义 数据倾斜是指在并行进行数据处理的时候,由于单个partition的数据显著多余其他部分,分布不均匀,导致大量数据集中分布到一台或者某几台计算节点上,使得该部分的处理速度远低于平均计算速度,成为整个数据集处理的瓶颈,从而影响整体计算性能。 7.1.2jvzquC41dnuh0lxfp0tfv8~g|qthj~n1ctzjeuj1fgzbkux134743A8:7
1.房屋的侧向位移与倾斜是一样的吗?这三个项目中,大家往往搞不清结构侧向位移的含义,经常与房屋的倾斜相互混淆,甚至老陈觉得可能连编制规范的人也没有搞清楚两者之间的区别。老陈觉得非常有必要厘清侧向位移和倾斜两者之间的关系。 二、房屋倾斜的定义 根据《建筑变形测量规范》JGJ8-2016的相关定义,所谓倾斜包括基础倾斜和上部结构倾斜。基础倾斜指的是jvzquC41yy}/hjsiegif0lto1unpy66;784ivvq
2.定义:倾斜角不是90°的直线.它的倾斜角的正切值叫这条直线的斜率2. 定义:倾斜角不是90°的直线,它的倾斜角的正切值叫这条直线的斜率,即=tan(≠90°);倾斜角为90°的直线没有斜率; 定义法:已知直线的倾斜角为α,且α≠90°,则斜率k=tanα. 直线方程法:ax+by+c=0的斜率。方向向量法:若a=(m,n)为直线的方向向量,则直线的斜率k=.过两点的直线的斜率;求导数;点jvzq<84yyy422:5lkcpjcx3eqo5ukvzarcmfa=742;?
3.Android自定义TextView实现文字倾斜效果Android有时候Android自带的控件无法满足我们的某些要求,这时就需要我们自定义控件来实现这些功能。比如在实际开发应用中,我们有时需要将TextView的文字倾斜一定的角度,就需要自定义TextView。下面这篇文章就给大家介绍了利用Android TextView如何实现文字倾斜效果。 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用! jvzquC41yy}/lk:30pku1jwvkerf1B=7494ivv
4.高三数学知识点总结①定义:倾斜角不是90°的直线,它的倾斜角的正切叫做这条直线的斜率。直线的斜率常用k表示。即。斜率反映直线与轴的倾斜程度。 ②过两点的直线的斜率公式: 注意下面四点: (1)当时,公式右边无意义,直线的斜率不存在,倾斜角为90°; (2)k与P1、P2的顺序无关; jvzq<84yyy4vpsx0eqs0hjsygpqv1;6627>/j}rn
5.高二数学知识点总结(集锦15篇)①定义:倾斜角不是90°的直线,它的倾斜角的正切叫做这条直线的斜率。直线的斜率常用k表示。即 。斜率反映直线与轴的倾斜程度。 当时, ;当时, ;当时, 不存在。 ②过两点的直线的斜率公式: 注意下面四点:(1)当时,公式右边无意义,直线的斜率不存在,倾斜角为90°; jvzquC41yy}/f~fpogoxgw3eqo5{qwllkg524B>2384ivvq
6.力矩载荷下轮毂轴承的动力学分析因此,通过分析在力矩为0.3 kN·m时的倾斜角之差来确定驱动条件对滞后的影响。其被定义为波动范围WH,如图8所示。 图8 波动范围WH的定义,表示为内圈倾斜角相对于力矩的滞后(第4章中使用了点PF和PR) 当车速和载荷变化频率均变化时,内圈倾斜角的波动范围如图9所示。随着车速的降低和载荷变化频率的增加,波动范围增大jvzquC41yy}/fxsiejkek7hqo1gsvrhng1=33><7339559<493836
7.大数据技术之19Spark学习07  (2)以 shuffle 作为输入的 Stage:这类 Stage 中出现 GC 的通常原因也是和 shuffle 有关,常见原因是某一个或多个 group 的数据过多,也就是所谓的数据倾斜,最简单的办法就是增加 shuffle 的 task 数量,比如在 SparkSQL 中设置SET spark.sql.shuffle.partitions=400,如果调大 shuffle 的 task 无法解决jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03=7754?
8.倾斜的意思词语:倾斜 拼音: qīng xié 注音: ㄑㄧㄥㄒㄧㄝˊ 近义词:歪斜 反义词:垂直笔直竖直 词语解释: [tilt;incline;slope] 歪斜;偏斜 磁针向地磁方向倾斜 引证解释: 1.歪斜;偏斜。 唐 韩愈 《雉带箭》诗:“衝人决起百餘尺,红翎白鏃随倾斜。”宋 苏轼 《次韵钱穆父紫薇花》之二:“折得芳蕤两眼花,题诗相报jvzquC41ekjjcw3f99=/exr1skthzrj35
9.摄影构图方式有哪些摄影的构图方式有几种9. 对角线构图——用“倾斜感”打破呆板,增加动感 定义:把主体或线条沿画面的对角线(从左上角到右下角,或右上角到左下角)摆放,打破横平竖直的呆板感,让画面更有动感和张力。 适用场景:动态场景(奔跑、跳跃、水流)、长条形物体(树枝、栏杆、围巾)、想表达“活力”或“紧张感”的画面。 jvzquC41yy}/srszwg9777hqo1ptlƒ}1Vgrfxrxkqp588;>840nuou
10.高一数学知识点总结①定义:倾斜角不是90°的直线,它的倾斜角的正切叫做这条直线的斜率。直线的斜率常用k表示。即。斜率反映直线与轴的倾斜程度。当时,。当时,;当时,不存在。 ②过两点的直线的斜率公式: 注意下面四点:(1)当时,公式右边无意义,直线的斜率不存在,倾斜角为90°; jvzquC41yy}/z~jzkng/exr1zwkykok1icuzk|mwzwk0e=<68;6/j}rn
11.Hive数据倾斜hive数据倾斜的表现本文介绍了数据倾斜的现象及其原因,详细探讨了数据倾斜在HiveQL和MapReduce中的表现形式及产生的场景,包括group by操作、count(distinct)使用、大小表连接及连接字段空值等问题。文中还提供了具体的解决方案。 数据倾斜的定义: 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 jvzquC41dnuh0lxfp0tfv8iqpvrjmnwcddou1jwvkerf1mjvckrt1:6648?::;
12.高一数学必修一知识点整理①定义:倾斜角不是90°的直线,它的倾斜角的正切叫做这条直线的斜率。直线的斜率常用k表示。即。斜率反映直线与轴的倾斜程度。 ②过两点的直线的斜率公式: 注意下面四点: (1)当时,公式右边无意义,直线的斜率不存在,倾斜角为90°; (2)k与P1、P2的顺序无关; jvzquC41yy}/7:yguv4og}4ujq}0;A>6:38/j}rn