React 純粋関数コンポーネント setState がページ更新を更新しない問題の解決方法

React 純粋関数コンポーネント setState がページ更新を更新しない問題の解決方法

問題の説明:

const [textList, setTextList] = useState(元の配列);
setTextList(新しい配列);


元の配列を変更する場合、元の配列が深い配列(複数のレイヤー)である場合、setTextListを使用して変更してもページの更新はトリガーされません。

原因分析:

これには、可変オブジェクトと不変オブジェクトの知識が必要です。Vue と React では、可変オブジェクトを更新すると、ビューが更新されることがあります。これは、Vue と React がデフォルトで浅いリスナーであり、最初のレイヤーのデータのみをリッスンするためです。内部レイヤーのデータの変更は監視されません。

解決:

ここでの私の解決策は、まず元の配列のディープ コピーを作成し、それを新しい配列に割り当て、次に新しい配列を変更して変更された新しい配列を渡すことです。これにより、ビューが更新されます。

var リスト = textList.concat();
リストを連結します(インデックス、1);
setTextList(リスト);

補足: Reactでは、フックが使用されている場合、useStateの更新はコンポーネントをレンダリングしません。

react を使用して図のようなコンポーネントを記述すると、重大な問題が見つかりました。クラスを使用して記述することを選択すると、コンポーネントを通じてレンダリングを更新するのが簡単になります。
関数コンポーネント フックを使用してコンポーネントをリファクタリングすることにしたとき、非常に難しい問題が見つかりました。onChange を使用して親コンポーネントの値を変更すると、値は変更されましたが、コンポーネントは再レンダリングされませんでした。 ? ? ?
混乱したので、値を空に設定してからクラスコンポーネントに割り当てようとしました。失敗したので、フックのライフサイクルを調べてみました。 。 。 。 ------失敗した場合は、Baidu を試してください---私も同じ問題を発見しました。 。 。最後にslice()を追加するだけでよいことがわかりました。
そこでまず問題を解決するために、図の赤い円をonChange(value.slice())に変更しました。
-----それで、この魔法の問題は解決しました。

問題は解決したので、戻って何が起こったのか見てみましょう。 。 。
ドキュメントを見ると、useStateのデータは不変(割り当て不可能なオブジェクト)でなければならないという一文が見つかりました。
つまり、ass コンポーネントの状態でも不変データの使用が推奨されていますが、setState が呼び出される限り更新がトリガーされるため、これは必須ではありません。したがって、クラス コンポーネントではこの問題は発生しません。または、空に変更してから値を割り当てることで更新をトリガーできます。
ただし、useState を再度使用する場合、同じオブジェクトが更新関数に渡されると、更新はトリガーされません。
したがって、解決策は、slice() を介して新しいオブジェクトを返して値を割り当てることであり、これが問題を解決するための鍵となります。 。 。 。

上記は、React Pure Function コンポーネントの setState 更新ページが更新されない問題の詳細な解決方法です。React の useState ページが更新されない問題の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • React.memo() を使用して関数コンポーネントのパフォーマンスを最適化する方法の詳細な説明
  • React の機能コンポーネントとクラスコンポーネントの違いをご存知ですか?
  • React 関数コンポーネントとクラスコンポーネントの使い方と利点の比較

<<:  VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

>>:  CentOS 6.9 で glibc ダイナミック ライブラリをアップグレードする詳細なプロセス

推薦する

xshellを使用してLinuxサーバーに接続する

xshellを使用してLinuxに接続する利点Windows環境でLinuxを直接操作できるインター...

CSSインジェクションの知識の要約

最近のブラウザでは、CSS 内で JavaScript を実行することはできなくなりました。以前は、...

初心者向け入門チュートリアル④:サブディレクトリのバインド方法

これが何を意味するのかを理解するには、まずサブディレクトリとは何かを知る必要があります。では、サブデ...

Linux で環境変数 JAVA_HOME を変更/設定する方法について簡単に説明します。

1. 永久的な変更、すべてのユーザーに有効# vi /etc/プロファイル//キーボードの[Shi...

ベースリンクタグの使用の紹介ベース

<br />リンクをクリックすると、ポップアップ表示される Web ページ アドレスは ...

フィールドを結合するSQL関数

最近、関連テーブル内のすべてのフィールドをクエリし、それらを 1 つのフィールドに再グループ化する必...

LinuxにVSCodeをダウンロードしてインストールし、プログラミングを使用して現在の時刻を出力する

rpmコマンドがソフトウェアのインストールに使用するパラメータはどれですか: -i rpm コマンド...

Vueのコンポーネント値の転送から始まるオブザーバーモードの詳細な説明

目次オブザーバーパターンVue パス値最初のステップは、main.jsにバスを登録することです。 2...

MySQLの行数カウントに関する簡単な説明

各テーブルの行数をカウントするために使用される MySQL count() 関数は、誰もがよく知って...

Vue で @person 関数を実装する方法

この記事ではvueを使用し、マウスクリックイベントといくつかの小さなページの最適化を追加します。 基...

HTML ウェブページでのアンカー(名前付きアンカー)の使用の概要

以下の情報はインターネットから収集したものです1. アンカーは、Web ページ作成におけるハイパーリ...

シンプルな商品スクリーニング機能を実現するjs

この記事の例では、商品スクリーニング機能を実装するためのjsの具体的なコードを参考までに共有していま...

複数のdiv内のテーブルのtdwidth設定は同じで、揃えることができません

最近、複数のdivにあるテーブルのTDを同じ幅に調整しても、揃えることができず、幅にパターンがないこ...

Docker で Jenkins サービスを構築する例

画像をプルする root@EricZhou-MateBookProX: docker pull je...

MySQL に大量のデータを挿入する 4 つの方法の例

序文この記事では主に、MySQLに大量のデータを挿入する4つの方法を紹介し、参考と学習のために共有し...