React は、動的なユーザー インターフェイスを構築するための最も人気のある JavaScript ライブラリの 1 つになりました。 React で最も重要なフックの 1 つは useEffect で、開発者はこれを使用して機能コンポーネントの副作用を管理できます。副作用には、データの取得、サブスクリプションの設定、DOM の手動操作などの操作が含まれます。このブログでは、useEffect とは何か、それがどのように機能するのかを詳しく説明し、理解を深めるために段階的な例を示します。
React では、useEffect は関数コンポーネントで副作用を実行できるようにする組み込みフックです。名前が示すように、副作用は、API 呼び出し、タイマー、ロギング、DOM の更新など、関数の外部に影響を与える操作です。
React 16.8 でフックが導入される前は、副作用を処理するためにクラス コンポーネントと、componentDidMount、componentDidUpdate、componentWillUnmount などのライフサイクル メソッドを使用する必要がありました。 useEffect を使用すると、これらのライフサイクル イベントが機能コンポーネントの 1 つの関数に結合されます。
useEffect は、いくつかの理由から React で副作用を管理するための強力なフックです。
useEffect フックは 2 つの引数を受け入れます:
基本的な構造は次のとおりです:
useEffect(() => { // Side effect logic goes here return () => { // Optional cleanup function }; }, [/* Dependencies go here */]);
import React, { useState, useEffect } from 'react'; function ExampleComponent() { const [data, setData] = useState(null); useEffect(() => { // Fetching data when the component mounts fetch('https://jsonplaceholder.typicode.com/posts/1') .then((response) => response.json()) .then((json) => setData(json)); // Optional cleanup (in this case, not needed) return () => { // Cleanup logic if necessary }; }, []); // Empty array means this effect will only run once when the component mounts return{data ? data.title : 'Loading...'}; }
この例では、コンポーネントが最初にレンダリングされるときに API からデータが取得され、結果が UI に表示されます。空の依存関係配列を渡すため、このエフェクトは最初のレンダリング後に 1 回だけ実行されます。
useEffect の実行時期を制御することで、パフォーマンスを最適化し、副作用が正しいタイミングで発生するようにすることができます。
すべてのエフェクトがクリーンアップを必要とするわけではありません。クリーンアップは、タイマーのクリアやデータ ストリームのサブスクライブ解除など、エフェクトの実行後に何かを削除またはリセットする必要がある場合にのみ必要です。
たとえば、クリーンアップが必要ないシナリオは次のとおりです:
import React, { useState, useEffect } from 'react'; function NoCleanupEffect() { const [count, setCount] = useState(0); useEffect(() => { console.log('Effect without cleanup runs every time the count changes'); }, [count]); // Runs every time `count` changes return (); }{count}
この場合、カウント状態が変化するたびにエフェクトがかかります。サブスクリプションを設定したり、外部リソースを管理したりしないため、クリーンアップは必要ありません。
エフェクトにサブスクリプションやタイマーの設定が含まれる場合は、エフェクトの後にクリーンアップする必要がある可能性があります。たとえば、タイマーを設定するシナリオを想像してください:
import React, { useState, useEffect } from 'react'; function TimerComponent() { const [time, setTime] = useState(0); useEffect(() => { const interval = setInterval(() => { setTime((prevTime) => prevTime 1); }, 1000); // Cleanup function to clear the timer return () => { clearInterval(interval); }; }, []); // Empty dependency array: effect runs once, and cleanup occurs when the component unmounts return{time} seconds have passed; }
何が起こっているかは次のとおりです:
useEffect が特に役立つ一般的なシナリオをいくつか見てみましょう。
コンポーネントのマウント時にデータを取得することは、useEffect の最も一般的な使用例の 1 つです。
useEffect(() => { fetchData(); async function fetchData() { const response = await fetch('https://api.example.com/data'); const result = await response.json(); setData(result); } }, []); // Empty dependency array means it runs once when the component mounts
レンダリング後に useEffect を使用して DOM を手動で操作できますが、React は DOM を効率的に管理するため、これは慎重に行う必要があります。
useEffect(() => { document.title = `You clicked ${count} times`; }, [count]); // Updates the document title whenever `count` changes
クリーンアップする必要があるサブスクリプションやイベント リスナーなどのリソースがある場合は、useEffect の return 関数を使用してこれを処理できます。
useEffect(() => { window.addEventListener('resize', handleResize); return () => { window.removeEventListener('resize', handleResize); }; }, []); // Cleanup listener when the component unmounts
1. useEffect で依存関係配列を省略するとどうなりますか?
依存関係配列を省略した場合、useEffect はレンダリングのたびに実行され、API 呼び出しなどの高価な副作用によりパフォーマンスの問題が発生する可能性があります。
2. useEffect は 1 回だけ実行できますか?
はい、空の依存関係配列 [] を渡すと、コンポーネントのマウント後にエフェクトが 1 回だけ実行されるようになります。
3. useEffect のクリーンアップ関数とは何ですか?
クリーンアップ関数は、コンポーネントがアンマウントされるとき、またはエフェクトが再度実行される前にエフェクトを元に戻す方法です。これは、タイマー、イベント リスナー、またはサブスクリプションをクリーンアップするのに役立ちます。
結論として、useEffect は React での副作用の管理を簡素化する強力で柔軟なフックです。副作用を実行するタイミングを制御し、必要に応じてクリーンアップすることで、コンポーネントを最適化し、不必要な再レンダリングやメモリ リークを回避できます。上記の例を試して、副作用管理の技術をマスターしてください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3