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 ダイナミック ライブラリをアップグレードする詳細なプロセス

推薦する

javascript:void(0) の意味と使用例

voidキーワードの紹介まず、void キーワードは JavaScript で非常に重要なキーワード...

VUE+Express+MongoDBのフロントエンドとバックエンドの分離によるノートウォールの実現

付箋紙の壁シリーズを実現しようと思っています。シンプルなものはシンプル、複雑なものは多機能です。開発...

nginx-ingress-controller ログ永続化ソリューションのソリューション

最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...

mysql5.7.33 で誤って ibdata ファイルを削除した後にデータを回復する方法

目次1. シナリオの説明: 2. 事例のデモンストレーション: 2.1. MySQLの障害発生前にデ...

現在のMySQL接続数を表示する方法の詳細な説明

1. 現在のすべての接続の詳細情報を表示します。 ./mysqladmin -uadmin -p -...

ウェブサイトのBGM実装方法

個々のウェブマスターにとって、自分のウェブサイトをいかにユニークで個性あふれるものにするかは、常に絶...

Linux 占有ポートの強制解放と Linux ファイアウォールのポート開放方法の詳しい説明

nginx、mysql、tomcat などのサービスをインストールするときに、使用する必要があるポー...

Linux/Mac MySQL パスワードを忘れた場合の対処方法

Linux/Mac の MySQL パスワードを忘れた場合はどうすればいいですか?心配しないでくださ...

nginx で複数のフロントエンド プロジェクトをデプロイするいくつかの方法

nginx を使用して 1 つのサーバーに複数のフロントエンド プロジェクトをデプロイする 3 つの...

Node.js のモジュール性、npm パッケージ マネージャーの説明

目次モジュール化の基本概念モジュール化とは何かモジュール分解の利点Node.js のモジュール性No...

ubuntu15.10 での hadoop2.7.2 の詳細なインストールと設定

Linux での Hadoop インストール チュートリアルはインターネットや書籍に多数ありますが、...

JS オブジェクト配列の重複排除のための 3 つの方法の例と比較

目次1. 重複排除前後のデータの比較2. 使い方1. フィルターとマップを使用する2. 削減を使用す...

Vue のすべてのカプセル化方法の簡単な概要

目次1. カプセル化API 2. グローバルツールコンポーネントを登録する3. グローバル関数をカプ...

MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

1. 同時実行性同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソース...

Vue2 キューブUI 時間セレクターの詳細な説明

目次序文1. 需要と効果必要効果2. コードの実装index.vue(html)日付方法テスト結果3...