Hook は React16.8 で追加された新しい機能です。 React の公式ドキュメントでは React フックの関連概念について説明されていますが、公式ドキュメントを読むだけではフックをうまく使いこなすのは難しく、フックを書く際に罠やエラーに陥りやすいです。この記事では5つの悪い場所をまとめています。 01. レンダリングが不要な場合はuseStateを使用する関数コンポーネントでは、 非推奨× 関数 ClickButton(props){ 定数[count, setCount] = setState(0) 定数onClickCount = () => { setCount((c) => c + 1) } 定数onClickRequest = () => { apiCall(カウント) } 戻る ( <div> <button onClick={onClickCount}>クリック</button> <button onClick={onClickRequest}>送信</button> </div> ) } 問題: 上記のコードをよく見ると、一見何も問題はありません。ボタンをクリックすると、 推奨√ 関数 ClickButton(props){ 定数カウント = useRef(0) 定数onClickCount = () => { count.current++ } 定数onClickRequest = () => { apiCall(カウント.現在) } 戻る ( <div> <button onClick={onClickCount}>クリック</button> <button onClick={onClickRequest}>送信</button> </div> ) } 02. リンクの代わりにrouter.pushを使用するReact SPA アプリケーションでは、 非推奨× 関数 ClickButton(props){ 定数履歴 = useHistory() 定数onClickGo = () => { history.push('/where-page') } 戻る <button onClick={onClickGo}>どこへ移動する</button> } 問題: 上記のコードは機能しますが、アクセシビリティの要件を満たしていません。ボタンはスクリーン リーダーによってリンクとして認識されません。したがって、コードを次のように変換できます。 推奨√ 関数 ClickButton(props){ 戻る <Link to="/next-page"> <span>どこへ行く</span> </リンク> } 03. useEffectでアクションを処理する場合によっては、React が DOM を更新した後に、追加のコードを実行したいことがあります。たとえば、ネットワーク リクエストの送信、DOM の手動変更、ログの記録などです。 非推奨× 関数 DataList({ onSuccess }) { const [ロード中、setLoading] = useState(false); 定数[エラー、setError] = useState(null); const [データ、setData] = useState(null); 定数フェッチデータ = () => { 読み込みをtrueに設定します。 呼び出しAPI() .then((res) => setData(res)) .catch((err) => setError(err)) .finally(() => setLoading(false)); }; 使用効果(() => { フェッチデータ(); }, []); 使用効果(() => { if (!ロード中 && !エラー && データ) { 成功の場合(); } }, [読み込み中、エラー、データ、onSuccess]); <div>データ: {data}</div> を返します。 } 問題: 上記のコードでは 2 つの 推奨√ 関数 DataList({ onSuccess }) { const [ロード中、setLoading] = useState(false); 定数[エラー、setError] = useState(null); const [データ、setData] = useState(null); 定数フェッチデータ = () => { 読み込みをtrueに設定します。 呼び出しAPI() .then((res) => { データ設定(res) 成功時() }) .catch((err) => setError(err)) .finally(() => setLoading(false)); }; 使用効果(() => { フェッチデータ(); }, []); <div>データ: {data}</div> を返します。 } 04. 単一責任コンポーネントコンポーネントを複数の小さなコンポーネントに分割する必要があるのはいつですか?コンポーネントツリーを構築するにはどうすればいいですか?これらすべての問題は、コンポーネントベースのフレームワークを使用するときに毎日発生します。ただし、コンポーネントを設計するときによくある間違いは、2 つのユースケースを 1 つのコンポーネントに結合することです。 非推奨× 関数 Header({ menuItems }) { 戻る ( <ヘッダー> <ヘッダー内部メニュー項目={メニュー項目} /> </ヘッダー> ); } 関数 HeaderInner({ menuItems }) { isMobile() を返します? <BurgerButton menuItems={menuItems} /> : <Tabs tabData={menuItems} />; } 問題: このアプローチでは、 推奨√ 条件を 1 レベル上に移動すると、コンポーネントの目的がわかりやすくなり、同時に 2 つの異なることを行おうとするのではなく、コンポーネントが 関数 Header(props) { 戻る ( <ヘッダー> {isMobile() ? <BurgerButton menuItems={menuItems} /> : <Tabs tabData={menuItems} />}} </ヘッダー> ) } 05. 単一責任の使用効果
非推奨× 関数の例(props) { 定数 location = useLocation(); 定数フェッチデータ = () => { /* API を呼び出す */ }; const updateBreadcrumbs = () => { /* パンくずリストを更新しています */ }; 使用効果(() => { フェッチデータ(); パンくずリストを更新します。 }, [location.pathname]); 戻る ( <div> <パンくず /> </div> ); } 問題: 上記の 推奨√ 1 つの useEffect から 2 つの副作用を分離します。 関数の例(props) { 定数 location = useLocation(); 定数フェッチデータ = () => { /* API を呼び出す */ }; const updateBreadcrumbs = () => { /* パンくずリストを更新しています */ }; 使用効果(() => { フェッチデータ(); パンくずリストを更新します。 }, [location.pathname]); 戻る ( <div> <パンくず /> </div> ); } 参照:2020 年に React コンポーネント (フック付き) を書くときによくある 5 つの間違い 以上が、Reactコンポーネントを記述する際にフックを使用する際に注意すべき5つのポイントの詳細です。Reactコンポーネントを記述する際のフックの詳細については、123WORDPRESS.COMの他の関連記事にも注目してください! 以下もご興味があるかもしれません:
|
<<: Nginx 静的サービス設定の詳細な説明 (ルートとエイリアスの指示)
>>: Linux での MySQL 5.6.27 インストール チュートリアル
1. nginxの動的と静的の分離の簡単な設定web1は静的サーバー、web2は動的サーバー、nod...
目次1. ドラッグ効果の例2. CSS実装の原則3. CSS実装の詳細4. CSSレイアウト1. 固...
コードをコピーコードは次のとおりです。 <div class="content&qu...
自動プロジェクト展開は大企業やユニコーン企業でよく使用され、手動でプロジェクトを展開するよりも効率的...
序文:一部のアプリケーション シナリオでは、成績や年齢によるランキングなど、ランキングの問題が発生す...
目次MySQL マスター スレーブ データベースが同期されない問題を解決する 2 つの方法1. 非同...
目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...
ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...
Typescript の利点については詳しく説明する必要はありません。ご興味があれば、(https:...
前書き: 以前、公式の nginx proxy_cache を CDN 静的キャッシュとして使用して...
データの応答性について話す前に、Vue はデータに対して具体的に何を行うのかという非常に重要な問題を...
目次1. 問題のシナリオ2. 原因分析3. 解決策4. 知識を広げる4.1 クエリの最適化を制限する...
cmdにnet start mysqlと入力すると、プロンプトが表示されます: サービス名が無効です...
1. MySQLが正常に起動しない場合は、エラーログ/var/log/mysql/error.log...
多くの場合、透明度の設定やぼかしなど、写真の背景を加工する必要があります。 ただし、背景画像が配置さ...