これは基本的に、ストア/ビューでの同期操作と非同期操作のベストプラクティスの問題です。フラックス・ストア内でフィルタリングする必要がありますか?
アイテムのリストのリアルタイム検索フィールドを作成しようとしています。
現在の実装では、私のサーバーからすべてのアイテムを要求し、ストアに保存します。ユーザーが検索フィールドに文字を入力すると、ビューは.filter()ネイティブ関数を使用して項目をフィルタリングします。残念ながら、これは、次のレンダリング(検索フィールドに表示されたキー入力文字を含む)の前に、(項目の数とフィルタの複雑さに起因して)いくらかの遅延を引き起こします。
私の質問です:代わりに、ストア内のアイテムのフィルタリングを初期化するアクションを呼び出し、ストアが完了するたびに更新する必要がありますか?その間に、フィルタリングされた結果が入力される前に、キー入力された文字をレンダリングすることができます。
直前の不完全な要求をフィルタリングするのを防ぐ直感的な方法はありますか?
編集:
コンポーネント/ビュー
_onChange() {
this.setState({
items: ItemStore.getFilteredItems()
})
},
handleSearchChange(event) {
this.setState({
searchText: event.target.value,
})
ItemActions.filterItems(event.target.value)
},
render() {...}
アクション
filterItems(searchTerm) {
dispatcher.dispatch({
type: FILTER_ITEMS,
searchTerm: searchTerm,
});
}
店
var _store = {
items: [],
filteredItems: []
}
var filter = function (searchTerm) {...}
...
Dispatcher.register(function (action) {
switch (action.type) {
case FILTER_ITEMS:
filter(action.searchTerm)
ItemStore.emit(CHANGE_EVENT)
break
}
})
012:
ここで新しい実装です
編集2:
アクション内でディスパッチして非同期にすると、setTimeoutが追加されてしまいました。また、項目のリストと検索を2つの異なるコンポーネントに分割して、リストの再レンダリングに必要な時間が検索フィールドコンポーネントに影響を与えたりブロックしたりしないようにしました。
パーフェクトとしてそれらを持っている必要があります。私はこれがより良いパターンであることに同意します。編集で私のコードを見てください。しかし、私のコードは、アクションがすぐにsearchTermを送出するので、私のコードはまだ同期しています - 私の最初のレンダリング(setStateのため)は、ストアがディスパッチされたアクションを受け取り、フィルタリングを処理した後に発生します。何か案は? –
良いpaternはサーバコールのデバウンス機能も使用します。 lodashで提供されるものと似ています。 https://lodash.com/docs#debounce –