我目前正在开展一个项目,涉及使用多个所见即所得的编辑器。我以前在同一个项目中使用了react-draft,但是一直使用静态元素,例如,每个编辑器都是固定的。
就我而言,我的编辑器是动态创建的(最小1,最多15)编辑器。我每次使用带有构造对象的map()将这些渲染到我的容器中。允许用户单击+或 - 按钮来创建/删除编辑器。
例如,要创建一个新的编辑器,我推送然后映射组件数组,如下所示:
components: [
{
id:1,
type: 'default',
contentValue: [
title: 'content-block',
value: null,
editorState: EditorState.CreateEmpty(),
]
}
]
我可以很好地渲染多个编辑器和createEmpty ediorstates。我的问题是当我尝试更新内容编辑器状态时。
通常要更新单个编辑器id使用:
onEditorStateChange = editorState => {
this.setState({
editorstate,
})
}
但是,鉴于我的编辑器是动态呈现的,我将编辑器状态隔离在“Components”数组中。所以我尝试了以下哪些不起作用:
在渲染中
this.state.components.map((obj) => {
return (
<Editor
editorState={obj.contentValue.editorState}
onEditorStateChange={(e) => this.onEditorStateChange(e, obj.id)}
/>
);
}
onEditorStateChange
onEditorStateChange(e, id){
const { components } = this.state;
const x = { components };
for (const i in x){
if(x[i].id ==== id){
x[i].contentValue.editorState = e;
}
}
this.setState({components: x})
}
在调试时,“setState”会在上面的代码片段中被调用,并且它确实输入了if语句,但是在我的editorState中没有设置任何值。
我很高兴有其他方法可供建议,只要这可以使用动态渲染的组件。
我需要设置此值,因为我将转换为HTML /字符串并使用内容保存到数据库。
我希望我已经解释得很好,如果不是,请让我知道并且很乐意提供进一步的信息/片段。
先感谢您。
好的,我想出了一个解决方案。
在我的onEditorStateChange()内部,我使用最初传入的参数(e)更新值。使用draftToHtml我将其转换为raw并将其传递给设置状态,如下所示:
onEditorStateChange(e, id) {
const { components } = this.state;
console.log(e);
const x = components;
for (const i in x) {
if (x[i].id === id) {
x[i].contentValue.editorState = e;
x[i].value = draftToHtml(convertToRaw(e.getCurrentContent()));
//console.log(x[i]);
}
}
this.setState({
components: x,
});
}
这给了我一个HTML值,我现在可以转换为字符串并保存到数据库。
希望这可以帮助其他人同样的问题:)