メモを使う親コンポーネントが再レンダリングされると、そのすべての要素 (状態、ローカル変数など) が新しくなることはわかっています。子コンポーネントが親コンポーネントのオブジェクト変数に依存すると、オブジェクトが変更されたかどうかに関係なく、子コンポーネントは新しいオブジェクトを取得し、子コンポーネントに対応する diff が無効になり、ロジックが再実行されます。次の例では、副作用依存関係に親コンポーネントから渡されたオブジェクト パラメータが含まれており、親コンポーネントが更新されるたびにデータ要求がトリガーされます。 関数情報({ スタイル、 }) { console.log('情報のレンダリングが行われます'); 使用効果(() => { console.log('データを再読み込み'); // 再レンダリングが発生するたびにデータが再読み込みされます}, [style]); 戻る ( <p スタイル={スタイル}> これは情報内のテキストです</p> ); } 関数ページ() { console.log('ページのレンダリング'); 定数[count, setCount] = useState(0); const スタイル = { 色: '赤' }; // カウンターが +1 になると、ページが再レンダリングされ、その結果、Info の再レンダリングがトリガーされます ( <div> <h4>カウント値: {count}</h4> <button onClick={() => setCount(count + 1)}> +1 </button> <情報スタイル={スタイル} /> </div> ); } React Hooks は解決策を提供します。useMemo を使用すると、渡されたオブジェクトをキャッシュし、依存関係が変更された場合にのみ、対応するオブジェクトを再計算して更新できます。 関数ページ() { console.log('ページのレンダリング'); const [色] = useState('赤'); 定数[count, setCount] = useState(0); const style = useMemo(() => ({ color }), [color]); // スタイルは色が大幅に変更された場合にのみ変更されます // カウンターが +1 になると、ページの再レンダリングがトリガーされ、次に情報の再レンダリングがトリガーされます // ただし、スタイルはキャッシュされているため、情報のデータの再読み込みはトリガーされません return ( <div> <h4>カウント値: {count}</h4> <button onClick={() => setCount(count + 1)}> +1 </button> <情報スタイル={スタイル} /> </div> ); } コールバックの使用React Hooks はデータ フローに 2 つの変更をもたらします。1 つ目は、状態管理のためのコンテキストのより使いやすい使用をサポートし、レイヤーが多すぎる場合に無関係なパラメーターが中間レイヤーに転送されることを回避します。2 つ目は、関数がデータ フローに参加できるようにし、冗長なパラメーターが下位レベルのコンポーネントに転送されることを回避します。 フックのコア モジュールの 1 つとして、useContext は渡されたコンテキストの現在の値を取得して、レイヤー間通信を実現します。 Reactの公式サイトに詳しい紹介があります。注意すべき点は、コンテキスト値が変わると、そのコンテキストを使用しているすべてのコンポーネントが再レンダリングされることです。無関係なコンポーネントの再描画を避けるためには、コンテキストを合理的に構築する必要があります。たとえば、最初のセクションで説明した新しい思考モードから始めて、状態の関連性に応じてコンテキストを整理し、関連する状態を同じコンテキストに保存することができます。 従来、親コンポーネントと子コンポーネントが同じデータ要求メソッド getData を使用し、このメソッドが上位層から渡されるクエリ値に依存する場合、通常はクエリメソッドと getData メソッドを一緒に子コンポーネントに渡す必要がありました。子コンポーネントはクエリ値を判断して getData を再実行するかどうかを決定していました。 クラス Parent は React.Component を拡張します { 状態 = { クエリ: 'キーワード', } 取得データ() { 定数 url = `https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.json?query=${this.state.query}`; // データを要求します... console.log(`リクエストパス: ${url}`); } 与える() { 戻る ( // 子コンポーネントがレンダリングしないクエリ値を渡す <Child getData={this.getData} query={this.state.query} /> ); } } クラスChildはReact.Componentを拡張します。 コンポーネントマウント() { このプロパティは、次の例のように機能します。 } コンポーネントが更新されました(前のプロパティ) { // if (prevProps.getData !== this.props.getData) { // この条件は常に真です // this.props.getData(); // } if (prevProps.query !== this.props.query) { // 判断にはクエリ値のみを使用できます this.props.getData(); } } 与える() { 戻る ( // ... ); } } React Hooks では、useCallback を使用すると関数をキャッシュし、依存関係が変更された場合にのみ更新できます。これにより、子コンポーネントで useEffect を使用してオンデマンド読み込みを実現できます。フックの連携により、関数は単なるメソッドではなく、値としてアプリケーションのデータ フローに参加できるようになります。 関数親() { 定数[count, setCount] = useState(0); const [クエリ、setQuery] = useState('キーワード'); 定数 getData = useCallback(() => { url に `https://mocks.alibaba-inc.com/mock/fO87jdfKqX/demo/queryData.json?query=${query}` を追加します。 // データを要求します... console.log(`リクエストパス: ${url}`); }, [query]); // getData はクエリが変更された場合にのみ更新されます // カウント値の変更によって、子がデータの再要求を行うことはありません ( <> <h4>カウント値: {count}</h4> <button onClick={() => setCount(count + 1)}> +1 </button> <input onChange={(e) => {setQuery(e.target.value)}} /> <子 getData={getData} /> </> ); } 関数Child({ データを取得 }) { 使用効果(() => { データを取得します。 }, [getData]); // 関数は依存関係としてデータフローに参加できます return ( // ... ); } 以上がReact useMemoとuseCallbackの使用シナリオの詳細な内容です。React useMemoとuseCallbackの使用の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
履歴コマンドを表示し、指定されたコマンドを実行します owen@owen:~/owen/softwa...
以前、テーブル結合クエリを書いていたとき、whereとonの違いがわからず、SQLに小さな問題が発生...
序文Docker イメージは Dockerfile といくつかの必要な依存関係で構成され、Docke...
目次1. カウンターの実装2. 成果を達成する1. カウンターの実装ページにカウンターを実装するだけ...
1. jdkダウンロードアドレスをダウンロードする我下載的是jdk-8u221-linux-x64....
ファイルシステムとは何かInnoDB や MyIASM などのストレージ エンジンはテーブルをディス...
落とし穴1. ネット上の多くのチュートリアルでは環境変数を設定するファイル名はmy.iniと書いてあ...
理由は簡単です。 HTML ドキュメントでは、複数の空白文字は 1 つの空白文字と同等です。つまり、...
1. はじめにMySQL ロックは、その範囲に応じて、グローバル ロック、テーブル ロック、行ロック...
今日 テーブル名から * を選択します。ここで、to_days(時間フィールド名) = to_day...
Binlog は、MySQL データの変更を記録するために使用されるバイナリ ログ ファイルです。B...
Ubuntu では、ショートカット キーでタッチパッドをオフにできない状況によく遭遇します。この問題...
1. 問題の説明<br />JS を使用してフォームの送信メソッドを呼び出してフォームを...
目次1. SVGを使用する2. fontAwesomeを使用する3 ソース4 結論テクノロジースタッ...
コードをコピーコードは次のとおりです。 <span style="font-fami...