首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「可视化搭建系统」——从设计到架构,探索前端领域技术和业务价值

如果我们保存并使用了运营编辑时使用的富文本信息,那么 C 端页面一定是“标题一”,而不是最新的“标题二”。因此我们只提交该 Sku 的 id。...综上需求和设计方案,我们选用了 Draft.js 作为这套多功能编辑器的底层框架,一句话足以总结做出该选择的原因:**Draft.js 实际上并不是一个富文本编辑器,它其实是一个用于构建富文本内容和富文本编辑器的基础设施...数据源解析 对于编辑器获取的数据 rawContent,我们使用 isDraftJson 工具函数判断该 rawContent 是否可以被多功能编辑器以 Draft.js 支持的数据解析:如果可以,则证明...事实上,拿到 Draft.js 编辑器的数据时,我们无法判断是用户自主回车创建的预期中的空行,还是自定义区块自带的前后空行,因此无法直接在结果数据上粗暴地移除空行。...编辑能力流程 使用体验确实不是一蹴而就的的事情,这是一个需要持续迭代优化的过程。经过不断地打磨,Versatile Editor 最终趋于稳定。

2K30

初探富文本之编辑器引擎

当前使用最广泛的富文本编辑器是L1的富文本编辑器,其能满足绝大部份使用场景,由此也诞生了非常多优秀的开源富文本引擎,这其中有仅提供引擎的编辑器例如Slate.js,也有提供了部分开箱即用的功能的例如Quill.js...,也有基于这些引擎二次开发的例如Plate.js,本文主要介绍了Slate.js、Quill.js、Draft.js三款编辑器引擎。...与DOM相同,slate的数据模型基于DOM,文档是一个嵌套的树,其使用文本选区selections和范围ranges,并且公开所有的标准事件处理函数,这意味着像是表格或者是嵌套引用这样的高级特性是可能的...Draft.js draft是用于在React中构建富文本编辑器的框架,其为创建和自定义文本编辑器提供了强大的API,并且旨在易于扩展和与其他库集成,与React结合可以使开发者在进行编辑器开发时既不用操作...不足 完全依赖于React作为UI层,与React深度绑定,在其他UI框架上很难使用。 数据结构模型的设计上不是很灵活,在实现表格等嵌套结构时比较受限。

1.9K51
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    脉脉上的 前端三大浪漫 是个啥?

    一、富文本编辑器 富文本编辑器市面上已经有很多优秀的开源版本了,但是问题在于每个产品的富文本编辑器需求不一样,所以可能导致有一些时候需要手撸编辑器 ---- 例如: Draft.js Slate.js...wangEditor 这些富文本编辑器还有衍生出他们的针对不同框架的版本,例如React,还有一些插件。...感兴趣的可以去github搜索给个star,方便以后用得上 作者当时手写过桌面软件的富文本编辑器(Electron,类似微信的聊天编辑器),痛苦得很,要控制光标、焦点,复制粘贴,适配多个操作系统环境的QQ...5.函数。内置常见公式,并支持自定义公式。 6.图表。目前支持折线图、柱状图、面积图、条形图、饼图,支持插入图片。...YATA 算法的并发冲突解决机制 基于 DeleteSet 和 Transaction 机制的撤销重做 基于两阶段划分的同步机制 它支持: 建模数据结构 解决并发冲突 回溯历史记录 同步网络状态等 使用示例

    55420

    最近迷上了富文本编辑器!

    虽然能用,用户体验可真是无语凝噎 接着,我就开始了折腾之路,我花了两周时间调研了市面上比较成熟的编辑器,比如,Draft.js 、Quill.js、ProseMirror、这些优秀的后起之秀,在比如TinyMCE...,如果有可以使用oop的场景,是不是也可以像他一样,将各个部分的功能整理归纳,通过组合、继承以及嵌套的方式去快速搭建你的应用呢?...它是「视图无关」的:Slate.js 定义了一套脱离 UI 实现的数据模型,考虑到我们不是要再学习一遍 React 或者 Vue,这也能让我们让脱离 UI 的繁文缛节,聚焦到编辑器的模型设计上。...attributeOldValue: true,      characterData: true,      characterDataOldValue: true,   }; ​    // 当观察到变动时执行的回调函数...不至于,从头搭建一个工程项目时无从下手。 编辑器选型推荐 说了这么多,还是回到正题,在自己的项目中,编辑器我们应该怎么选?

    3.7K30

    Python常见十六个错误集合,你知道

    其实,上面的报错还有一个原因经常遇到,就是无首行缩进,例如写if语句是,后面加冒号后如果直接换行,好的代码编辑器会自动首行缩进,但有些代码编辑器可能没有这个功能,这是需要你手动缩进,这是最好养成习惯,不要连续敲几次空格键...3.TypeError: max_pool2d() got an unexpected keyword argument ‘atride’ 这个错误就是纯粹的手误问题了,你定义的函数中没有这个关键字,这时候就要自己查看定义的函数名字...4.NameError: global name ‘time’ is not defined 这个问题是我在调用函数time.time()用来计算时间损耗时,使用的函数时报错的,具体解决方案很简单,只要在代码开头加上...(),如果是使用from os import *,那么是可以直接使用listdir(),但是会出现模块之间的命名冲突问题,对代码的稳定性会有一定的影响,所以LZ建议如果对模块函数还不是很熟悉的情况下哈市使用第一种方法...9.TypeError: ‘dict_keys’ object does not support indexing 这个问题是python版本的问题 #如果使用的是python2 firstStr =

    1.4K20

    全网最值得收藏的Python常见报错及其解决方案,再也不用担心遇到BUG了!

    Python 3.x环境中时, 可能会发生一些语法错误。...1、print 变成了 print() 在Python2版本中,print是作为一个语句使用的,在 Python3版本中print。作为一个函数出现。下面通过两段代码来展示两个版本的区别。...虽然很多IDE编辑器可以选择显示空格,但是即便是这样,也很难找到到底哪里有问题。所以建议小伙伴在程序中只使用Tab键实现代码缩进,或者只使用Space键实现代码缩进。...另外,上面的报错还有一个原因经常遇到,就是无首行缩进,例如在编写if语句时在后面加冒号,如果直接换行, 好多代码编辑器会自动首行缩进。...还有一种情况也会引发上述错误,错误的使用了“=”而不是“==”。在Python程序中,“=”是赋值操作符,而“==”是等于比较操作。

    1.6K01

    【最全BUG修复宝典】肝!你遇到的BUG解决方案全在这了!

    但是现在的大部分Python开发已经使用了3.x的版本,所以当我们直接将Python 2.7代码运行在Python 3.x环境中时, 可能会发生一些语法错误。接下来就总结一下。...1、print 变成了 print() 在Python2版本中,print是作为一个语句使用的,在 Python3版本中print。作为一个函数出现。下面通过两段代码来展示两个版本的区别。...虽然很多IDE编辑器可以选择显示空格,但是即便是这样,也很难找到到底哪里有问题。所以建议小伙伴在程序中只使用Tab键实现代码缩进,或者只使用Space键实现代码缩进。 ?...另外,上面的报错还有一个原因经常遇到,就是无首行缩进,例如在编写if语句时在后面加冒号,如果直接换行, 好多代码编辑器会自动首行缩进。...还有一种情况也会引发上述错误,错误的使用了“=”而不是“==”。在Python程序中,“=”是赋值操作符,而“==”是等于比较操作。

    1.3K31

    Python 自动化指南(繁琐工作自动化)第二版:一、PYTHON 基础知识

    之后,你可以在带有其他变量和值的表达式中使用它 ➋。当一个变量被赋予一个新值 ➌ 时,旧值就被遗忘了,这就是为什么在例子的最后spam被求值为42而不是40。这叫做覆盖变量。...当有疑问时,使用你最好的判断。 你的第一个程序 虽然交互式 Shell 适合一次运行一条 Python 指令,但是要编写整个 Python 程序,您需要将指令输入到文件编辑器中。...记住,你必须在文件编辑器窗口中按F5,而不是在交互式 Shell 窗口中。当你的程序要求时,输入你的名字。...当您编写函数名时,末尾的左括号和右括号将其标识为函数名。这就是为什么在这本书里,你会看到print()而不是print。第 3 章更详细地描述了函数。...TypeError: can only concatenate str (not "int") to str 这个错误不是由print()函数引起的,而是您试图传递给print()的表达式引起的。

    1K31

    一文带你了解富文本是如何协同工作的

    1、基于 contenteditable 2、不⽤ document.execCommand,⾃主实现 3、⼏万⾏~⼏⼗万⾏代码 CKEditor、TinyMCE Draft.js、Slate ⽯墨⽂...可定制的空间有限 L1 站在浏览器肩膀上,能够满足99%业务场景 无法突破浏览器本身的排版效果 L2 技术都掌握在自己手中,支持个性化排版 技术难度相当于自研浏览器、数据库 2021年后,国外notion使用了块级编辑器...之后块级编辑器的思路被认可,做L1的notion一样可以有自己排版布局,再加上现代浏览器国内的不断加强,似乎L1没有足够的动力升级为L2编辑器了。...,apply函数传入的参数就是8种原子操作。...这样岂不是,一个人的数据永远会被另一个覆盖~~ 先别担心,因为实际使用中,双方是持续不断输入的,绝大多数情况下,不会在同一次合并中,同时修改一个值。当然,如果真的触发了,则会覆盖。

    94830

    【完美解决方案】TypeError: ‘module‘ object is not callable

    本篇博客我们将深入探讨一个常见的Python错误——TypeError: 'module' object is not callable。这个问题经常困扰开发者,尤其是在使用模块和函数时容易产生混淆。...当我们尝试调用一个模块时,Python解释器会抛出TypeError: 'module' object is not callable的错误,提示我们模块不能像函数那样直接调用。...例如,我们需要调用模块中的特定函数,而不是模块本身。 示例: import os os() # 错误,os 是模块,不是函数 3....比如我们想使用math模块中的sqrt函数,那么应该导入该函数,而不是直接调用模块。...示例: from math import sqrt result = sqrt(16) # 正确调用函数 3.3 使用别名 为了避免模块名与其他函数或变量重名,可以在导入模块时使用别名。

    1.2K10

    解密!第一个开源架构工作台的构建过程

    构建一个架构工作台并不是一件容易的事,涉及到了一系列的编译器相关的知识,编辑器相关的知识,当然还有其核心的架构相关的知识。...技术评估:DSL、REPL 与编辑器 再回到实现上来,在进行架构工作台的技术评估时,我们关注于架构师编写的 DSL(领域特定语言)语法、REPL(read–eval–print loop) 运行环境以及用于交互的编辑器...在构建架构适应度函数时,也可以使用语言库提供的数学功能,以便于定制各类的计算规则。...于是乎,为了探索更好的文档交互方式,我们陆陆续续参考了一系列的编辑器:CodeMirror、Draft.js、Lexical、ProseMirror 等。...也就是说:即可以写 Markdown 也可以用富文本的方式(PS:在编写此文时,我使用的 Quake 的底层也是 ProseMirror)。

    1.3K10

    TypeError: Cannot read property ‘length‘ of undefined :读取未定义变量长度的完美解决方法

    引言 在JavaScript开发中,TypeError 是一种非常常见的错误,特别是在处理对象或数组时。当我们试图访问一个未定义或空值的变量属性时,就会引发这个错误。...通常,这个错误会表现在试图访问数组或字符串的 length 属性时。 1.1 什么是 TypeError: Cannot read property 'length' of undefined?...2.3 函数返回值为 undefined 有时候,我们可能从一个函数中获取到 undefined,而不是我们期望的数组或字符串,这同样会导致这个错误: function getArray() {...'length' of undefined 在这个例子中,getArray 函数返回了 undefined,导致后续代码中尝试访问 length 属性时出错。...3.3 函数返回值校验 在使用函数返回值之前,先进行校验,确保返回的不是 undefined 或 null: function getArray() { return undefined; }

    37810

    基于slate构建文档编辑器

    基于slate构建文档编辑器 slate.js是一个完全可定制的框架,用于构建富文本编辑器,在这里我们使用slate.js构建专注于文档编辑的富文本编辑器。...而类似于Draft.js、Slate.js,他们是富文本编辑器的core或者叫做controller,并不是一个完整的功能,这样就能够让我们有非常高的可定制性,当然也就会造成开发所需要的时间比较多。...与DOM相同,slate的数据模型基于DOM,文档是一个嵌套的树,其使用文本选区selections和范围ranges,并且公开所有的标准事件处理函数,这意味着像是表格或者是嵌套引用这样的高级特性是可能的...slate的文档虽然不是特别详细,但是他的示例是非常丰富的,在文档中也提供了一个演练作为上手的基础,对于新手还是比较友好的。...在这里插件注册时通过slate-plugins.tsx来实现,具体来说,每个插件都是一个必须返回一个Plugin类型的函数,当然直接定义一个对象也是没问题的,函数的好处是可以在注册的时候传递参数,所以一般都是直接用函数定义的

    1.1K10

    TypeError: ‘module‘ object is not callable 完美解决方法

    引言 TypeError: 'module' object is not callable 是Python中的一个常见错误,通常发生在你试图像调用函数一样调用一个模块时。...作为全栈开发者,我们在项目中使用各种模块和库时,这个问题不可避免。了解其根源并掌握解决方法,将极大地减少开发过程中不必要的时间浪费。 正文内容 1....如果你尝试直接调用模块而不是其中的函数或类,Python会抛出TypeError: 'module' object is not callable错误。...1.1 错误的常见场景 import math result = math(5) 上面的代码将会抛出TypeError,因为math是一个模块,而不是一个函数。...A1: 通常是因为你尝试调用模块本身而不是模块中的函数或类。 Q2: 如何避免模块与函数名冲突? A2: 你可以使用模块别名来避免命名冲突。 Q3: 这个错误只在Python中存在吗?

    45810

    TypeError: ‘NoneType‘ object is not subscriptable | 完美解决方法

    如果你在使用Python开发时,遇到这个问题,不用担心,它通常与对一个None对象使用下标操作有关。本文将详细介绍这个错误的原因、如何避免它,并通过具体的代码示例帮助你解决此类问题。...一般来说,这种错误的根源是函数或操作返回了None,而不是预期的值。 常见导致 NoneType 下标错误的场景及解决方案 1....错误地使用可变对象时赋值为空 在处理字典、列表等可变对象时,如果对象未能正确初始化或赋值为None,随后的下标操作就会导致错误。...从字典中获取值为None 在使用字典的get方法时,如果指定的键不存在,默认情况下返回None。当你试图对返回的值进行下标操作时,就会引发TypeError。...处理函数返回None的安全性 为了避免函数返回None导致的下标错误,你可以在调用函数时进行安全检查,确保返回值不是None。

    1.4K10

    讲解{TypeError}clamp(): argument min must be Number, not Tensor

    讲解TypeError: clamp(): argument 'min' must be Number, not Tensor在使用PyTorch进行深度学习任务时,我们经常会遇到类型错误(TypeError...当使用PyTorch的clamp()函数时,如果参数min的类型为Tensor而不是Number,就会触发这个异常。clamp()函数在开始讲解异常之前,我们首先需要了解clamp()函数。...错误原因当我们使用clamp()函数时,错误的使用了一个Tensor类型的值作为min_value,而不是Number类型的值。...由于clamp()函数要求min_value必须是一个数值,而不是张量,因此会抛出TypeError。...结论本文讲解了在使用PyTorch的clamp()函数时可能出现的TypeError: clamp(): argument 'min' must be Number, not Tensor异常。

    54810
    领券