Vue2で配列の変更を検出できない理由と解決策

Vue2で配列の変更を検出できない理由と解決策

JavaScript の制限により、Vue は次の配列の変更を検出できません。

  • インデックスを使用して配列項目を直接設定する場合、例: vm.items[indexOfItem] = newValue
  • 配列の長さを変更する場合、例えば:vm.items.length = newLength
var vm = 新しい Vue({
  データ: {
    項目: ['a', 'b', 'c']
  }
})
vm.items[1] = 'x' // 応答なし vm.items.length = 2 // 応答なし

回避策

手動で監視を追加する // Vue.set
Vue.set(vm.items、アイテムのインデックス、新しい値)
vm.$set(vm.items, アイテムのインデックス, 新しい値)
Vue は配列変更メソッドの応答性を実装しているため、配列変更メソッドを使用します // Array.prototype.splice
vm.items.splice(アイテムのインデックス、1、新しい値)

Vue2.0 で 2 つの配列の変更を監視できないのはなぜですか?

公式ドキュメントでは、これら 2 つの点について、「JavaScript の制限により」実装不可能であると簡単にまとめており、Object.defineProperty はデータの変更を検出するためのソリューションです。この制限は Object.defineProperty のことを指しているのでしょうか?

実際、その理由は Object.defineProperty() の脆弱性ではなく、パフォーマンス上の考慮によるものです。配列内の Object.defineProperty のパフォーマンスはオブジェクト内と同じです。配列のインデックスはオブジェクト内のキーとみなすことができます。

  • 対応する要素の値をインデックスでアクセスまたは設定する場合、ゲッターメソッドとセッターメソッドをトリガーできます。
  • プッシュまたはシフト解除するとインデックスが増加します。新しく追加された属性は、確認する前に手動で初期化する必要があります。
  • pop または shift によって要素を削除すると、インデックスが削除および更新され、setter メソッドと getter メソッドもトリガーされます。

したがって、Object.defineProperty には配列インデックスの変更を監視する機能がありますが、vue2.x ではこの機能は廃止されています。

ソースコード分析

Object.property はインデックスを通じて配列を変更する操作を検出できますが、Vue はこれを実装していません。それではソースコードを見てみましょう。

ヴュー3.0

Vue 3.0 では、既存の問題を解決するために Object.defineProperty() の代わりに proxy が使用されます。

以上が、Vue2で配列の変更が検出できない原因と解決方法の詳しい内容です。Vue2の配列の変更についてさらに詳しく知りたい方は、123WORDPRESS.COMのその他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • Vue2 レスポンシブシステム: ディープレスポンス
  • Vue2 レスポンシブシステムのネスト
  • Vue2 レスポンシブシステム ブランチ切り替え
  • Vue2 レスポンシブ システムの紹介
  • Vue2 レスポンシブシステム非同期キュー
  • vue2.x 配列ハイジャック原則の実装
  • Vue2 レスポンシブ システム アレイ

<<:  Kafka の Docker デプロイメントと Spring Kafka 実装

>>:  Windows で virtualenv を使用して仮想環境を作成する方法 (2 つの方法)

推薦する

Web ページのエンコーディングで gbk や gb2312 ではなく utf-8 が使用されるのはなぜですか?

選択肢がある場合は、UTF-8を使用することをお勧めします。実際、Windows システム自体のプロ...

Docker は次の「Linux」になれるか?

Linux オペレーティング システムは過去 20 年間にわたってデータ センターに革命をもたらし...

docker ベースの mariadb のインストール構成プロセスの分析

1. インストール dockerhub を通じてインストールする mariadb のバージョンを検索...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...

高同時実行シナリオにおける nginx 最適化の詳細な説明

日常の運用・保守作業では、nginx サービスが頻繁に使用され、nginx の高同時実行性によって生...

MYSQLが中国語を認識できない問題の恒久的な解決策

ほとんどの場合、MySQL はインストールしたばかりのときは中国語をサポートしません。これはエンコー...

Vue の親子コンポーネントの値転送と一方向データフローの問題の詳細な説明

目次序文1. 親コンポーネントが子コンポーネントに値を渡す2. サブコンポーネントのprops型制約...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

Windows プラットフォーム構成 5.7 バージョン + MySQL データベース サービス

ルートユーザーのパスワードを初期化するプロセスと、よくある2つの問題の解決策が含まれています。 1....

GZIP 圧縮 Tomcat と Web パフォーマンスの改善プロセス図

1. はじめに最近、あるプロジェクトに取り組んでいたのですが、サーバーからクライアントに返される J...

mysql 更新ケース更新フィールド値が固定されていない操作

特定のデータの一括更新処理において、特定のステータスが固定値に更新されるなど、更新するフィールドの値...

Docker で最初のアプリケーションをデプロイする方法

前回の記事では、Docker Desktop をインストールし、Kubernetes を有効にしまし...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...

CSS スタイルを HTML 外部スタイルシートにインポートする方法

リンクインスタイルとは、すべてのスタイルを 1 つ以上の外部スタイルシート ファイルに配置することで...

ES6 ループと反復可能オブジェクトの例

この記事では、ES6 の for ... of ループについて説明します。古い方法以前は、JavaS...