我试图让一个函数仅在 contentState 本身发生变化时运行,而不仅仅是 editorState。
我现在的想法是将旧的 contentState 存储为字符串并将其与新的 contentState 作为字符串进行比较,但是将状态转换为字符串并进行比较似乎非常浪费。有没有更好的办法?
我试图让一个函数仅在 contentState 本身发生变化时运行,而不仅仅是 editorState。
我现在的想法是将旧的 contentState 存储为字符串并将其与新的 contentState 作为字符串进行比较,但是将状态转换为字符串并进行比较似乎非常浪费。有没有更好的办法?
您可以简单地将您的价值与您old state
的价值进行比较,new state
您不必将convert
它与string
.
编辑:这是一个关于反应的概念state
,您不必担心,large state object
因为最佳实践建议这样做
常见的误解:
state
是举行的large object
。它只是引用其他一些对象的对象。没什么大不了的。
我使用了另一种方法来检查编辑器内容是否已更改。
基本上我正在使用一个 npm 模块deep-equal来比较原始 contentState 对象(即 contentState 使用 convertToRaw 函数转换为简单的 JS 对象)。在您的 onChange 处理程序中,比较旧的和新的原始 contentState 对象。
注意:deep-equal 模块的比较比在 try/catch 中包装节点的 assert.deepEqual() 快大约 5 倍。
这是 onChange 处理程序代码:
const deepEqual = require('deep-equal');
this.onChange = (editorState) => {
let oldContent = convertToRaw(this.state.editorState.getCurrentContent());
let newContent = convertToRaw(editorState.getCurrentContent());
let sameContent = deepEqual(oldContent, newContent);
this.setState({editorState});
if (sameContent === false)
console.log('Content has changed.');
}
这与 Faisal Mushtaq 的回答没有太大区别,但包括一些改进。在您的组件中constructor
:
// keep track of the last state
let lastContentState = this.state.editorState.getCurrentContent()
this.onChange = editorState => {
this.setState({ editorState })
// push your handling code onto the call stack with a setTimeout
// so that it doesn't block handling new inputs to the editor
setTimeout(() => {
// first-time focus or blur, no change to content
if (!editorState.getLastChangeType()) return
const currentContentState = editorState.getCurrentContent()
// ES6 to compare, could use Immutable.is() instead
const toHandle = !Object.is(lastContentState, currentContentState)
if (toHandle) {
// your handler function, eg passed in as a prop
this.props.handleChange(currentContent)
// current content becomes last content
lastContentState = currentContentState
}
}, 0)
}