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 インストール チュートリアル
この記事では、Ubuntu18.04にmysql5.7.23をインストールする具体的な方法を参考まで...
序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...
目次序文Toastコンポーネントをカプセル化する方法ユースケース具体的な実装要約する序文ビジネスが発...
Seurat は、単一細胞解析用の重量級の R パッケージです。使用したことがある人なら誰でも、その...
目次1. オブジェクトリテラル2. newキーワードはオブジェクトを作成する3. Object.cr...
序文このコントロールを直接印刷すると下部に透かしが入りますが、公式 Web サイトから購入することで...
.net 開発に関しては、Microsoft の SQL Server データベースに精通しており、...
解凍したフォルダ C:\web\mysql-8.0.11 を開き、フォルダ内に my.ini 構成フ...
オンラインチュートリアルに従って実装しました。 zabbix3.4、スクリプトとsendEmailを...
1. まずデータベースサーバーを停止しますサービスmysqld停止2.vim /etc/my.cnf...
よく使われる4つのMySQLエンジンの紹介(1):MyISAMストレージエンジン:トランザクションや...
目次1. カーソルとは何ですか? 2. カーソルの使い方1. カーソルを宣言する2.カーソルを開く3...
この記事では主に、オブジェクト内のフィールドを削除するための js の実装を紹介し、次のように共有し...
テンプレート 1: ログイン.vue <テンプレート> <p class=&quo...