ホームページ ウェブフロントエンド jsチュートリアル React 開発でよくある間違いとその回避方法 ⚛️

React 開発でよくある間違いとその回避方法 ⚛️

Dec 22, 2024 pm 08:09 PM

私は数年間 React アプリケーションを開発してきましたが、プロジェクトの開発を遅らせる数え切れないほどの間違いを経験してきました。

React は、動的ユーザー インターフェイスを構築するための最も人気のあるライブラリの 1 つですが、その柔軟性は、新しい開発者にとってよくある間違いにつながる可能性もあります。

このガイドでは、開発者が React で犯しやすい主な間違いを取り上げ、より適切で効率的なコードを作成するための実用的なヒントを提供します。

飛び込んでみましょう!

1. 状態の突然変異

続行する前に、まず項目のリストを表示し、追加または削除する React コンポーネントを作成しましょう。

import { useState } from "react";

const Home = (props) => {
    const [items, setItems] = useState(['item1', 'item2']);
    const [itemToAdd, setItemToAdd] = useState('');

    function wrongHandleAddItem(item) {
        items.push(item);

        setItems(items);
    }

    function goodHandleAddItem(item) {
        if (item.length === 0)
            return;

        const newArray = [...items, item];

        setItems(newArray);
        setItemToAdd('');
    }

    function removeItem(item) {
        const itemIndex = items.indexOf(item);

        if (itemIndex !== -1) {
            const newArray = [...items];

            newArray.splice(itemIndex, 1);
            setItems(newArray);
        }
    }

    return (
        <div>



<p>Here, I wrote two different methods to add an item in the items state array. Let's break it down together:<br>
</p>

<pre class="brush:php;toolbar:false">function wrongHandleAddItem(item) {
    items.push(item);

    setItems(items);
}
ログイン後にコピー
ログイン後にコピー

このメソッドが最初に行うことは、要素を配列に追加することを目的としたプッシュ配列関数の呼び出しです。
2 番目のことは、setItems を呼び出して状態変数に変更を適用することです。

ただし、このコードを実行しても機能しません ❌

このコードは、非常に重要な React ルール、状態の変更に違反しています。

React は状態変数の ID に依存して、状態がいつ変化したかを判断します。項目を配列にプッシュするとき、その配列の ID は変更されないため、React は値が変更されたことを認識できず、配列を再レンダリングできません。

修正方法は次のとおりです ✅ :

function goodHandleAddItem(item) {
    if (item.length === 0)
        return;

    const newArray = [...items, item];

    setItems(newArray);
    setItemToAdd('');
}
ログイン後にコピー
ログイン後にコピー

このメソッドでは、スプレッド演算子を使用して新しい配列を作成しました。これにより、項目のコンテンツを使用して新しい配列をインスタンス化できます。 2 番目のパラメーターは、新しいコンテンツ (ここの項目) を追加するために使用されます。

最後のステップは、setItems メソッドを呼び出して変数項目の新しい状態を検証することです ✅


2. リストでキーを生成しない

Top ommon Mistakes in React Development and How to Avoid Them ⚛️

すべての React 開発者は、おそらく開発過程で少なくとも 1 回はこのエラーを目にしたことがあるでしょう。

これが発生する最も一般的な方法は、データをマッピングする場合です。この違反の例は次のとおりです:

items.map((item) => (
    <div>
        {item}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

要素の配列をレンダリングしたい場合は、各項目を識別できるように React にもう少しコンテキストを与える必要があります。可能な限り最良の場合、一意の識別子である必要があります。

これを簡単に修正する方法は次のとおりですが、これは最適ではありません:

items.map((item, index) => (
    <div key={index} >
        {item}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

React の経験を積み、React がどのようにより良く機能するかを理解すると、自分のケースに基づいて React が適切かどうかを判断できるようになります。

これを完璧にするには、crypto.randomUUID() などの UUID ジェネレーターを使用し、次のようにオブジェクトとして項目リストに保存します。

const newItemToAdd = {
    id: crypto.randomUUID(),
    value: item
};
const newArray = [...items, newItemToAdd];
  setItems(newItems);
ログイン後にコピー
ログイン後にコピー

レンダリング中に次のように使用します:

items.map((item, index) => (
    <div key={item.id} >
        {item.value}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

これで完璧です ✅


3. useEffect での async の使用

マウント時に API からデータをフェッチする必要がある関数があるとします。 useEffect フックを使用し、await キーワードを使用します。

最初の試行を確認してみましょう:

ご存知のとおり、await キーワードは async キーワードでマークされた関数内にある必要があります。

import { useState } from "react";

const Home = (props) => {
    const [items, setItems] = useState(['item1', 'item2']);
    const [itemToAdd, setItemToAdd] = useState('');

    function wrongHandleAddItem(item) {
        items.push(item);

        setItems(items);
    }

    function goodHandleAddItem(item) {
        if (item.length === 0)
            return;

        const newArray = [...items, item];

        setItems(newArray);
        setItemToAdd('');
    }

    function removeItem(item) {
        const itemIndex = items.indexOf(item);

        if (itemIndex !== -1) {
            const newArray = [...items];

            newArray.splice(itemIndex, 1);
            setItems(newArray);
        }
    }

    return (
        <div>



<p>Here, I wrote two different methods to add an item in the items state array. Let's break it down together:<br>
</p>

<pre class="brush:php;toolbar:false">function wrongHandleAddItem(item) {
    items.push(item);

    setItems(items);
}
ログイン後にコピー
ログイン後にコピー

残念ながら、これは機能せず、次のエラー メッセージが表示されます:

function goodHandleAddItem(item) {
    if (item.length === 0)
        return;

    const newArray = [...items, item];

    setItems(newArray);
    setItemToAdd('');
}
ログイン後にコピー
ログイン後にコピー

これが修正です: useEffect フック内に別の非同期関数を作成します ✅

items.map((item) => (
    <div>
        {item}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

async キーワードの意味を理解することが重要です。
オブジェクト json を返すのではなく、オブジェクト json を解決する Promise を返します。

useEffect は Promise を返すことになっていないため、これは実際には問題です。これは (上記のように) 何も返さないか、クリーンアップ関数を返すことを期待しています。クリーンアップ関数は重要ですが、このガイドの範囲外ですが、ここで使用します:

items.map((item, index) => (
    <div key={index} >
        {item}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

4. 再レンダリング前の状態へのアクセス

状態管理に戻って、新しい開発者がよく犯すもう 1 つの興味深い間違いを見てみましょう。これは、React の状態をさらに深く理解するのに役立ちます。

これを説明するために、goodHandleAddItem メソッドを取り上げてみましょう。

const newItemToAdd = {
    id: crypto.randomUUID(),
    value: item
};
const newArray = [...items, newItemToAdd];
  setItems(newItems);
ログイン後にコピー
ログイン後にコピー

このコードを実行すると、期待した結果がコンソールに記録されないことがわかります。

ここに問題があります: 状態変数のセッター関数は非同期です。

setItems メソッドを呼び出すとき、実際には変数を割り当てているのではなく、更新をスケジュールしています。

これが修正です: newArray 変数で変数の内容が何であるべきかはすでにわかっています。つまり、items 変数の内容であると思われるデータを使用するには、setItems ✅ の後であっても、代わりに変数 newArray

を使用する必要があります。

5. 古い状態データの使用

最後のガイドも React の状態管理について説明します。このガイドを読み終えるとあなたもプロになれます! ?

React Hooks を使用する際のよくある落とし穴は、古い状態データの誤用です。これは、連続した状態更新で状態変数を直接参照するときに発生する可能性があります。前のエラーで見たように、状態の更新は非同期である可能性があります。これは、連続する呼び出しで状態変数が参照されるときに、状態変数が最新の値を反映しない可能性があることを意味します。

物事をわかりやすくするために、よく知られたカウンターである新しい例を使用してみましょう:

items.map((item, index) => (
    <div key={item.id} >
        {item.value}
        <button onClick={() => removeItem(item)}>-</button>
    </div>
))}
ログイン後にコピー
ログイン後にコピー

上記の使用法は間違っています。実際、count は setCount 呼び出し内で直接参照されます。イベント ハンドラーとライフサイクル メソッドでは、状態の更新をバッチ処理することができ、両方ともカウントとして同じ初期値を使用するため、最終状態が不正確になります。

物事を機能させるために使用できる setCount の別の形式として、アップデーター関数があります。アップデーター関数は、以前の状態を引数として受け取り、新しい状態を返すため、連続する各更新には正しい値が含まれ、望ましくない動作が防止されます。

使用方法は次のとおりです:

import { useState } from "react";

const Home = (props) => {
    const [items, setItems] = useState(['item1', 'item2']);
    const [itemToAdd, setItemToAdd] = useState('');

    function wrongHandleAddItem(item) {
        items.push(item);

        setItems(items);
    }

    function goodHandleAddItem(item) {
        if (item.length === 0)
            return;

        const newArray = [...items, item];

        setItems(newArray);
        setItemToAdd('');
    }

    function removeItem(item) {
        const itemIndex = items.indexOf(item);

        if (itemIndex !== -1) {
            const newArray = [...items];

            newArray.splice(itemIndex, 1);
            setItems(newArray);
        }
    }

    return (
        <div>



<p>Here, I wrote two different methods to add an item in the items state array. Let's break it down together:<br>
</p>

<pre class="brush:php;toolbar:false">function wrongHandleAddItem(item) {
    items.push(item);

    setItems(items);
}
ログイン後にコピー

count の内容をログに記録すると、正しい値が示されるようになりました ✅


結論

これらのよくある間違いを避けることで、よりパフォーマンスの高い React アプリケーションを開発し、状態管理をマスターできるようになります。

このガイドがお役に立てば幸いです。また、コーディングの時間を楽しく過ごしていただけることを願っています。

新規または確認済みの React 開発者として、このガイドを楽しんでいただけた場合は、「いいね!」を残してください?

また会いましょう!

以上がReact 開発でよくある間違いとその回避方法 ⚛️の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles