React.Memoでグリップする
React.memo Reactの純粋なコンポーネントの機能を提供しますが、クラスベースのコンポーネントではなく機能ベースのコンポーネントに使用できます。
memoization はコンピュータサイエンスの専門用語です。これは、高価な関数呼び出しの結果をキャッシュし、引数が同じ場合にキャッシュされたバージョンを返すことを意味します。
Reactの用語で:
欲しくない MyNewComponent ときに再レンダリングする props 渡されるのは同じです。
簡単なカウンターの例
React.memoがどのように機能するかを頭に入れておくために、Codesandboxで次の例を作成しました。
ボタンがクリックされた回数をカウントするシンプルなアプリです。 下のスクリーンショットから、ページの上部にバナーが表示されていることがわかります。
想像してみてください Banner はさまざまなタイプを持つことができるUIコンポーネントです。この場合、 info バナーを入力して、 Banner 次のように:
<Banner type="info" />
私たちの CounterComponent このように見えます:
class CounterComponent extends Component {
state = { buttonPressedCount: 0 };
render() {
const { buttonPressedCount } = this.state;
return (
<div className="new-component">
<h4>Button Pressed Count: {buttonPressedCount}</h4>
<button
onClick={() =>
this.setState({ buttonPressedCount: buttonPressedCount + 1 })
}
>
Increase Count
</button>
<Banner type="info" />
</div>
);
}
}
そして私たちの Banner コンポーネントは次のようになります。
const Banner = props => {
const { type } = props;
if (type === "info") {
return <div className="info-banner">I am an info banner</div>;
}
};
私たちの中で CounterComponent、ボタンをクリックするたびに、 buttonPressedCount あなたが期待するものである再レンダリングを引き起こす変数。 これに伴う問題は、 Banner コンポーネントは、 props それに渡されることは変わっていません。
これを回避するために、 memo のように動作します PureComponent が再レンダリングを停止するという事実で props 変わっていません。 更新されたコードは次のようになります。
const Banner = memo(props => {
const { type } = props;
if (type === "info") {
return <div className="info-banner">I am an info banner</div>;
}
});
今私たちの Banner コンポーネントは、 props それに変わった。
これがReactメモの基本的な考え方です。
は同じ
では、もう少し進んで、カスタムの平等について話しましょう。 デフォルトでは、 memo のみ shallow 小道具と小道具のオブジェクトの比較。 2番目の引数を渡して、カスタムの同等性チェックを示すことができます。
React.memo(Component, [areEqual(prevProps, nextProps)]);
これはに似ています shouldComponentUpdate しかし、その逆、すなわち 戻る true の shouldComponentUpdate 別のレンダリングを引き起こしますが areEqual 反対です。
私たちが持っていたと想像してください Person 受け入れたコンポーネント prop オブジェクトである人は、 name 同じです。
const areEqual = (prevProps, nextProps) => {
return (prevProps.name === nextProps.name)
};
React.memo(Person, areEqual);
結論
これはReactへの本当に素晴らしい追加であり、不必要な再レンダリングを心配することなく機能コンポーネントを使用することができます。 いつものように、この投稿で何か良いことを学んだことを願っています!