javascript - 如何合并多个draft-js ContentState

标签 javascript reactjs draftjs

我收藏了多个 draft-js ContentStates我想将它们合并在一起以将它们显示在一个 <Editor />
为什么?
通过我的 GUI,您可以单独编辑文本片段,然后稍后将它们连接在一起。
然后您会看到结果文本,您仍然可以对其进行编辑。

我坚持个人ContentStates如下:

const contentState = EditorState.getCurrentContent();
const raw = convertToRaw(contentState);

这给了我一个对象:
{
   blocks: [...],
   entityMap: {...}
}

我尝试的是手动合并 blocksentityMap , 得到一个结果原始 contentState,然后我可以用 convertFromRaw 解析它

然而,每个块都有一个所谓的唯一键,在不同的 contentState 中,这些键重叠并且不是唯一的。

因此,这种情况下的结果是某些块被其他具有相同 key 的块覆盖。

有没有人有一个更简单的方法来实现我正在做的事情的想法?

最佳答案

Draft.js 中有一个函数可以生成唯一键:

import { genKey } from 'draft-js'
如果您查看它的代码,您会发现它是有状态的(请参阅 seenKeys ?):
const seenKeys = {};
const MULTIPLIER = Math.pow(2, 24);
  
function generateRandomKey(): string {
    let key;
  
    while (key === undefined || seenKeys.hasOwnProperty(key) || !isNaN(+key)) 
    {
       key = Math.floor(Math.random() * MULTIPLIER).toString(32);
    }
  
    seenKeys[key] = true;
    return key;
}
  
module.exports = generateRandomKey;
所以我相信,您可以通过映射块并重新生成它们的键来解决您的问题(我将使用 Ramda 来获得更简洁和富有表现力的代码):
import * as R from 'ramda'

const mergedObjectWithOverlappingKeys = {
   blocks: [...],
   entityMap: {...}
}

const result = R.evolve({
   blocks: R.map(R.assoc('key', genKey())),
})(mergedObjectWithOverlappingKeys)

关于javascript - 如何合并多个draft-js ContentState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57572203/

相关文章:

javascript - 理解 React 高阶组件

javascript - Draft js 保存和渲染或显示内容

javascript - getBoundingClientRect 在 Safari 中为顶部、左侧、右侧、底部返回 0

reactjs - 如何在我的react组件中渲染draft js的LINK类型的实体图?

javascript - 记录复杂对象时内存泄漏

javascript - 如何从 iframe 内部捕获 iframe resize 事件(iframe 和页面 - 同一域)

javascript - 为什么当我开始使用 localStorage 时代码停止工作?

javascript - 字符串枚举的反向映射

javascript - 区分 iPad 和 .来自网络应用程序内部的 iPhone?

node.js - React 前端和 Node 后端的安全性