Reactを使用したワークフローで何らかのメモ化を使用しようとしていますが、React and Redux
を含むワークフローと統合するための最良かつ最も重要な"easiest"ソリューションを探しています。
私は一般的なメモ化について話している多くの記事に出くわしました、そしていくつかは「メモ化-one」の使用を示して、それを起動して実行するのが最も速くて最も簡単であると支えます、そして他のものはそれについて言及せずに「再選択」について話します。
どちらがより良く、最も簡単で、どれに投資すべきかを知りたいだけです。
両方ライブラリ関数を返すこれ指定された数の引数を受け入れるおよび値を返す:
getA(arg1, arg2, arg3) // Returns a value
differenceは、内部で何が起こるかを示しています関数が呼び出されたとき。
===
)inputSelectors
関数を実行しますinputSelectors
の戻り値を収集しますinputSelectors
の戻り値を前の呼び出しで取得した値と比較します(===
)memoize-one
は値ベースのメモ化ユーティリティです:メモ化提供された引数の値に対して実行されます。
reselect
は、その上にさらに評価レイヤーを追加します。メモ化は引数値に対しては実行されませんが、セットの結果inputSelectors
関数 =これらの初期引数が与えられます。
これは、各reselect
が別のinputSelectors
セレクターになる可能性があるため、reselect
セレクターを簡単に構成できることを意味します。
再選択は使用していませんが、メモしてください。レンダー内の小道具から何かを計算したい場合に最適です。これは、時間の経過とともに変化する可能性があるが、一部の再レンダリングでは変化しない可能性がある小道具で、大きな配列のマッピングなどの高価な操作を実行するための優れたパターンです。これにより、レンダリングで使用されるコストのかかる操作が、入力が変更された場合にのみ再計算されます。また、getDerivedStateFromPropsのようなライフサイクルメソッドを使用する必要がなくなります(小道具から計算できる場合は、おそらく状態になってはいけません)。
import memoize from 'memoize-one'
class Example extends Component {
mapList = memoize(
(list) => list.map(item => ({text: item.text}))
)
render() {
// if this.props.list hasn't changed since the last render
// memoize-one will re-use the last return value from cache
const mappedList = this.mapList(this.props.list)
return (
...
)
}
}
ほとんどの場合、静的クラス変数を使用するのではなく、メモ化された関数をコンポーネントインスタンスにアタッチする必要があることに注意してください。これにより、コンポーネントの複数のインスタンスが互いのメモ化されたキーをリセットするのを防ぎます。
reselect
は、React/Reduxで使用するように特別に設計されているため、使用することをお勧めします。 memoize-one
は、汎用のメモ化ライブラリのようなものです。
再選択は本当に簡単に使用できます。セレクターをラップするだけです。
import { createSelector } from 'reselect';
const shopItemsSelector = state => state.shop.items;
// without reselect
const subtotalSelector = state => {
const items = shopItemsSelector(state);
return items.reduce((acc, item) => acc + item.value, 0);
}
// with reselect
const subtotalSelector = createSelector(
shopItemsSelector, // list the selectors you need
items => items.reduce((acc, item) => acc + item.value, 0) // the last argument is actual selector
)