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 インストール チュートリアル
目次Dockerコンテナのソースコードを使用してhttpdをデプロイし、ストレージボリュームを使用し...
テーブルの欠点1. テーブルは他の HTML タグよりも多くのバイトを占有します。 (ダウンロード時...
<br />1年前、インターネット上にはinline-blockプロパティに関する記事は...
目次シーン紹介プラグインの実装問題1: 重複したヘッダーコンポーネント質問2: 別の実装アイデア質問...
超初心者の私は、MySQL を学び始めたばかりで、インストール プロセス中に多くの問題に遭遇しました...
1. /etc/init.dディレクトリに新しいrabbitmqを作成します。 [root@loca...
<br />内容はインターネットから転載したものです。どこから見つけたのか忘れてしまいま...
コードの一部:コードをコピーコードは次のとおりです。 <ul class="abou...
ページにDOCTYPEを追加するブラウザによってタグやスタイルシートの解釈が異なるため、さまざまなブ...
テーブルとは何ですか?セルセルで構成されています。表では、<td> の数は、<tr...
このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...
MySQL ストアド プロシージャ パラメータには、in、out、inout の 3 種類があります...
変換して翻訳するTransform は、変換と変形を意味します。他の幅属性や高さ属性と同様に、CSS...
Tomcatの設定まずTomcatをインストールするTomcatのインストールは、Tomcatのイン...
iframe を使用すると、他の Web サイトのページを簡単に呼び出すことができますが、注意して使...