私は、contentState自体が変更されたときだけ関数を実行しようとしています。DraftJSでcontentStateが変更されたかどうか、または単にeditorStateであるかどうかを確認する最高のパフォーマンスメソッド
今の私の考えは、古いcontentStateを文字列として保存し、それを新しいcontentStateと文字列として比較することですが、これは状態を文字列に変換して比較するのは非常に無駄です。より良い方法がありますか?
私は、contentState自体が変更されたときだけ関数を実行しようとしています。DraftJSでcontentStateが変更されたかどうか、または単にeditorStateであるかどうかを確認する最高のパフォーマンスメソッド
今の私の考えは、古いcontentStateを文字列として保存し、それを新しいcontentStateと文字列として比較することですが、これは状態を文字列に変換して比較するのは非常に無駄です。より良い方法がありますか?
の値をold state
と比較すると、new state
の値をconvert
からstring
に簡単に比較できます。
EDIT:state
はlarge object
で開催されています。ここには、ベストプラクティスがそのように
一般的な誤解を行うことをお勧めしますと、あなたが
large state object
心配を持っていないstate
の反応についての概念です。他のいくつかのオブジェクトを参照するオブジェクトです。それについて大きなものはありません。
フェアポイントを助けていない場合は、我々はより詳細に助けることができる比較コードを共有し、まだすべてのクリックで、この比較的大きなオブジェクトを比較するために、無駄と思われる場合、キーを押す、など私はこれをoverthinkingですか? 私はこのような小さなことを知っていますが、パフォーマンスを殺すつもりはありませんが、非常に無駄に思えます。これは最も無駄な方法ですか? – Slbox
''大きなオブジェクト 'について言及したような場合には、 ''新しい状態' 'でそれらを更新するのが簡単ではない場合に比較しても大丈夫です。 –
これらは不変オブジェクトであるため、比較が迅速に行われることに注意してください。アイデンティティを比較するのではなく、内容を比較している。つまり、 'this.state.editorState.getCurrentContent()=== newEditorState.getCurrentContent()' –
エディタの内容が変更されているかどうかを確認する別の方法を使用しました。
基本的には、raw contentStateオブジェクト(contentStateをconvertToRaw関数を使用して単純なJSオブジェクトに変換したもの)を比較するためにnpmモジュールdeep-equalを使用しています。 onChangeハンドラで、古いcontentStateオブジェクトと新しいraw contentStateオブジェクトを比較します。
注:deep-equalモジュールによる比較は、ノードのassert.deepEqual()をtry/catchでラップするより約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.');
}
最も多くアップされた答えによって示唆されるように、参照平等をチェックするよりもずっと高価です。 –
これはファイサル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)
}
私の答えはあなたに多くの –