反応を用いた性能最適化memo ()
7650 ワード
導入 React.memo
は、プロップの1つが変更された場合にのみ変更するコンポーネントのmemoizedされたバージョンを返します.と同じですPureComponent
しかし、クラスの代わりにReact.memo
は機能的なコンポーネントに使用されます.
なぜ使用する反応。メモ? React.memo
レンダリングされた出力を記憶し、不要なレンダリングをスキップします.これは、コンポーネントのレンダリングに必要なコンポーネントと計算の不要な再レンダリングを防ぐのに役立ちます.
反応する。行動のメモ
例の実装として、次のコンポーネントを作成できます
React.memo
レンダリングされた出力を記憶し、不要なレンダリングをスキップします.これは、コンポーネントのレンダリングに必要なコンポーネントと計算の不要な再レンダリングを防ぐのに役立ちます.反応する。行動のメモ
例の実装として、次のコンポーネントを作成できます
GreetUser
コンポーネントをレンダリングしながらいくつかの重い計算をシミュレートする作業を行うコンポーネントです.// userGreeting.js
const UserGreeting = () => {
const getUserName = () => {
let i = 0;
while (i < 3000000000) i++;
return 'John Doe';
};
return <div>Hello {getUserName()},</div>;
};
GreetingCount
and Button
コンポーネントは、カウントとインクリメントgreetカウントをそれぞれクリックして表示されます.// greetingCount.js
const GreetingCount = ({ count }) => (
return <div>You greeted me {count} times.</div>;
);
// button.js
const Button = ({ title, onClick }) => (
<button onClick={onClick}>{title}</button>
);
そして、親コンポーネントはこれらのすべてのコンポーネントをインポートし、挨拶カウントを更新するメソッドを持っています.//App.js
const App = () => {
const [greetCount, setGreetCount] = useState(0);
const onGreet = () => {
setGreetCount(greetCount + 1);
};
return (
<div className='App'>
<UserGreeting />
<GreetingCount count={greetCount} />
<Button title='Hi' onClick={onGreet} />
</div>
);
};
問題
ボタンがクリックされた後にUI更新前に特定の間隔の遅延があることがわかります.これは、ボタンをクリックすると、すべてのコンポーネントが再構築され、
GreetUser
コンポーネントが再構築されます.The getUserName
メソッドの再レンダリングによって再度実行されますGreetUser
コンポーネントは、UI更新の遅延を引き起こします.解決策
したがって、上記の問題の解決策は
React.memo()
. The React.memo()
メソッドは、コンポーネントをメモし、コンポーネントの浅い比較を行いますGreetUser
コンポーネントが変更されました、このコンポーネントの再レンダリングをスキップします.これは、レンダリング中に再計算を防ぐとUIをすばやく更新します.このため、コンポーネントをラップしますReact.memo()
そしてそれをエクスポートします.const UserGreeting = () => {
// code here
};
export default React.memo(UserGreeting);
結果:
コンポーネントが再表示されないようになりました
GreetUser
コンポーネントとUIの遅延なしで更新されます.あなたは完全な例を見つけることができますCodeSandbox
Reference
この問題について(反応を用いた性能最適化memo ()), 我々は、より多くの情報をここで見つけました https://dev.to/truemark/performance-optimization-using-react-memo-36e9テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol