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 つの方法)

推薦する

Linux 上の Vim で色とテーマを変更する方法

Vim は Linux でよく使用されるテキスト エディターです。 Vim は、Sublime や ...

CentOS6.7 mysql5.6.33 でデータファイルの場所を変更する方法

問題: MySQL がデータ ファイルを保存するパーティションの容量が小さく、現在いっぱいになってい...

Day.js をベースにした JavaScript での日付処理のよりエレガントな方法

目次day.js を使用する理由モーメントデイ.js day.js がなければどうなるでしょうか? ...

mysql 5.7.5 m15 winx64.zip インストール チュートリアル

win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...

Dockerコンテナデータボリュームの原理と使用法の分析

コンテナデータボリュームとはデータがコンテナ内にある場合、コンテナを削除するとデータは失われます。例...

MySQL複合インデックスの概要

目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...

WeChatミニプログラムユーザー認証による携帯電話番号の取得(getPhoneNumber)

序文ミニプログラムには、ユーザーを取得するための非常に便利な API があり、getPhoneNum...

MySQL および Oracle のバッチ挿入 SQL の一般的な記述例

目次例えば:一般的な執筆:要約する例えば:次に、データベースのUSERテーブルにUserオブジェクト...

kindとDockerを使用してローカルKubernetes環境を起動する

導入Kubernetes を使い始めるのに丸一日を費やしたことはありませんか?最近登場したいくつかの...

jQueryでフルスクリーンスクロール効果を実現

この記事の例では、フルスクリーンスクロールを実現するためのjQueryの具体的なコードを参考までに共...

jQueryはアコーディオン効果を実装します

この記事では、アコーディオンを実装するためのjQueryの具体的なコードを参考までに紹介します。具体...

MySql 5.7.20 のインストールとデータおよび my.ini ファイルの構成

1. まずMySqlの公式サイトからダウンロードします参考: https://www.jb51.ne...

HTML で div+CSS を使用してシンプルな矢印アイコンを実装するコード

ウェブデザインでは、ウェブページを美しく見せるために矢印を装飾としてよく使用します。現在、多くのウェ...

JavaScriptを使って動的にテーブルを生成するケースの詳しい説明

目次序文実装のアイデア実装コード成果を達成する序文これは、テーブルを動的に追加する例です。[追加] ...

MySQLのLIMIT文について詳しく説明します

目次質問サーバー層とストレージエンジン層LIMITって何ですか?何をするか?トゥカオ最近、Q&...