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 インストール チュートリアル
Navicat クライアントを通じてデフォルトの日時値を変更する際に問題が発生しました。データベース...
1. Get はサーバーからデータを取得するために使用され、Post はサーバーにデータを渡すために...
<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...
FTP は主にファイル転送に使用され、Linux では vsftpd で実装されるのが一般的です。F...
残念ながら、社内の IM のテスト中に MYSQL_DATA_TRUNCATED エラーが再び発生し...
この記事では、ボタン切り替え画像を実現するためのVueの具体的なコードを例として紹介します。具体的な...
目次1. mixin の使い方は? 2. ミックスイン使用時の注意2.1. ミックスイン オブジェク...
目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...
PHPのメール関数を使用してメールを送信するmail()関数はメールサーバーに接続し、サーバーと対話...
目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...
Docker を初めて使い始めると、通常とは異なる問題に遭遇して、必然的に混乱してしまいます。大丈夫...
1. 背景実際のプロジェクトでは、分散スケジュールされたタスク実行の状況に遭遇することがあります。ス...
ステップ1: システムのアーキテクチャを確認する dpkg --print-architecture...
概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...
序文Docker と VS Code を使用すると、ローカル開発環境全体を最適化し、プロジェクトの進...