これを想像してみてください。洗練された機能豊富な React アプリを構築したばかりですが、突然パフォーマンスが低下し始めます。ボタンの動作が遅く、データの更新に時間がかかりすぎ、その理由がわかりません。これに聞き覚えがあるかもしれませんが、あなたは一人ではありません。 React の再レンダリングは、不適切に処理されると、パフォーマンスの問題の背後にある隠れた原因となることがよくあります。
React での再レンダリングをマスターすることは、効率的でスケーラブルなアプリケーションの構築を目指す Web 開発者にとって非常に重要です。 React の再レンダリングがどのように機能するかを深く掘り下げて、パフォーマンスを最適化し、よくある落とし穴を回避し、React アプリを超高速エクスペリエンスに変換するための実践的な戦略を見つけてみましょう。
React の再レンダリング メカニズムは、最も強力な機能の 1 つです。これにより、アプリは状態やプロパティの変化に基づいて UI を動的に更新できます。ただし、最適化されていない場合、このプロセスは不必要な再レンダリングにつながり、パフォーマンスの低下を引き起こす可能性があります。
簡単に言えば、React は毎回再レンダリングします:
しかし、コンポーネントの再レンダリングが頻繁に行われるとどうなるでしょうか?ブラウザーは画面を再描画する必要があるため、アニメーションが不安定になり、操作が遅くなり、ユーザーがイライラすることになります。ここで、自分自身に問いかけてください。アプリが遅いと感じながらも、その理由を正確に特定できなかったことが何度ありますか?
過剰な再レンダリングによりドミノ効果が生じ、アプリ全体が遅くなります。再レンダリングが発生するたびに:
小さなアプリでは、これは目立たない可能性があります。しかし、深くネストされたコンポーネントと複雑な状態管理を備えた大規模なアプリケーションでは、最小の不必要な再レンダリングさえもパフォーマンスのボトルネックになる可能性があります。
簡単な例を示します:
const UserList = ({ users }) => { return users.map(user =>{user.name}); }; // Inside a parent component:
次に、ユーザーが変更されていない場合でも、親コンポーネントが更新されるたびに、この UserList が再レンダリングされると想像してください。ここに問題があります。このような不必要な再レンダリングを防ぐにはどうすればよいでしょうか?
親コンポーネントが再レンダリングされるたびに、実際の値が変更されていない場合でも、新しい関数とオブジェクトの参照が作成されます。これにより、子コンポーネントが不必要に再レンダリングされます。
アクション: useCallback フックと useMemo フックを使用して、関数とオブジェクトをメモ化します。
const ParentComponent = () => { const handleClick = useCallback(() => { // some function logic }, []); const userDetails = useMemo(() => ({ name: "Rajesh", age: 30 }), []); return; };
機能する理由: メモ化により、再レンダリングのたびに新しい関数とオブジェクトの参照が作成されなくなり、子コンポーネントでの不必要なレンダリングが削減されます。
インライン関数またはオブジェクトは、コンポーネントがレンダリングされるたびに作成され、実際の値が変更されていない場合でも、受信コンポーネントが再レンダリングされます。
アクション: コンポーネントの外で関数とオブジェクトを宣言するか、メモ化フックを使用してください。
// Avoid this:console.log("clicked")} /> // Instead: const handleClick = useCallback(() => console.log("clicked"), []);
一部のコンポーネントは本質的に純粋であり、同じ props が与えられると常に同じ出力をレンダリングします。それでも、React.memo がなければ、親コンポーネントが再レンダリングされると、依然として再レンダリングされます。
アクション: 不要な再レンダリングを防ぐために、機能コンポーネントを React.memo でラップします。
const ChildComponent = React.memo(({ data }) => { return{data.name}; });
機能する理由: React.memo は、コンポーネントがそのプロパティが変更されたときにのみ再レンダリングされるようにし、冗長なレンダリングを回避します。
「コンポーネントが再レンダリングされるのはなぜですか?」と疑問に思ったことはありませんか? React DevTools は、レンダリングを追跡し、どこで問題が発生しているかを理解するための優れた方法を提供します。
次のようなカスタム フックを使用して再レンダリングをログに記録することもできます:
const useWhyDidYouRender = (componentName, props) => { const previousProps = useRef(props); useEffect(() => { if (previousProps.current !== props) { console.log(`${componentName} re-rendered`); previousProps.current = props; } }); };
状態を上位コンポーネントまで引き上げると、子コンポーネントの不必要な再レンダリングが発生することがあります。代わりに、可能な限りローカルで状態を管理してください。
リストをレンダリングするときは、各項目に安定した一意のキー プロパティがあることを確認してください。これは、変更された項目を特定することで React が再レンダリングを最適化するのに役立ちます。
これにより、メモリ リークやパフォーマンスの問題が発生する可能性があります。 useEffect クリーンアップ関数を使用して、アンマウントされたコンポーネントでの再レンダリングを回避します。
useEffect(() => { return () => { // cleanup logic here }; }, []);
つまり、React の再レンダリングはパフォーマンスの問題の隠れた原因となる可能性がありますが、適切なテクニックを使用すれば、不必要な再レンダリングを防ぎ、アプリの高速性を維持し、スムーズなユーザー エクスペリエンスを保証できます。
次回 React アプリを最適化するときは、各再レンダリングについて批判的に考えてください。それらは必要なのでしょうか?この関数をメモ化するとどうなるでしょうか?これらの戦略を適用することで、よりスリムで高速な React コードを作成し、最も経験豊富な開発者でもつまずくよくある落とし穴を回避できるようになります。
最終的な考え: React の再レンダリングの詳細を学習したので、次はこれらの最適化を独自のアプリに適用してください。パフォーマンスが向上するだけでなく、スケーラブルで保守可能な React コードを書くことに自信が持てるようになります!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3