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 インストール チュートリアル
目次MySQL の 4 つの分離レベルデータ テーブルを作成します。分離レベルの設定物事の分離レベル...
序文私は less/sass を書くことに慣れていますが、小さなプログラムを開発するときには、まだ ...
この記事では、アニメーション効果の非表示と表示を実現するためのJQueryの具体的なコードを参考まで...
1.位置:固定一部の Web サイトの右下隅にあるポップアップ ウィンドウなどの、ブラウザーを基準と...
質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...
HTMLコード:コードをコピーコードは次のとおりです。 <td align="cen...
WindowsにTomCatをインストールするこの記事では、WindowsプラットフォームにTomC...
1. 背景一般的に、データ ウェアハウス環境では、row_number 関数を使用して特定のディメン...
目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...
導入:従来の画像検証コードと比較して、スライダー検証コードには次の利点があります。サーバーは検証コー...
目次ドラッグアンドドロップの実装ドラッグイベントドラッグして開始リリースゾーンでの移動境界処理、角度...
スプレッド演算子を使用すると、式をある時点で展開できます。スプレッド演算子は、複数のパラメーター (...
<Head>タグに追加する<meta http-equiv="pragm...
Vueに触れたばかりのパートナーの多くは、開発環境ではVueプロジェクトは正常であるが、パッケージ化...
Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...