6

我试图让一个函数仅在 contentState 本身发生变化时运行,而不仅仅是 editorState。

我现在的想法是将旧的 contentState 存储为字符串并将其与新的 contentState 作为字符串进行比较,但是将状态转换为字符串并进行比较似乎非常浪费。有没有更好的办法?

4

3 回答 3

4

您可以简单地将您的价值与您old state的价值进行比较,new state您不必将convert它与string.

编辑:这是一个关于反应的概念state,您不必担心,large state object因为最佳实践建议这样做

常见的误解:state是举行的large object。它只是引用其他一些对象的对象。没什么大不了的。

于 2016-08-27T15:36:26.547 回答
0

我使用了另一种方法来检查编辑器内容是否已更改。

基本上我正在使用一个 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.');
}
于 2016-10-25T14:23:09.453 回答
0

这与 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)
}
于 2016-12-10T02:09:55.333 回答