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

推薦する

nginxを使用してドメイン名ベースの仮想ホストを構成する

1. 仮想ホストとは何ですか?仮想ホストは、特殊なテクノロジーを使用して、実行中のサーバーを論理的に...

モバイル開発チュートリアル: ピクセル表示の問題の概要

序文モバイル端末の開発の過程で、モバイル端末のディスプレイはデスクトップ端末のディスプレイとは一般的...

ReactでのsetStateの使用と同期と非同期の使用

React では、this.state を使用して状態を直接変更しても、コンポーネントは再レンダリン...

レスポンシブレイアウトの概要(推奨)

レスポンシブレイアウト開発の基礎知識この章は主に以下の部分に分かれています• レスポンシブデザインを...

プロジェクトの再構築からプロジェクトにおける CSS3 カスタム変数の使用について話す

CSS3変数について変数を宣言するときは、変数名の前に 2 つのハイフン ( -- ) を追加します...

Win10でのMySQL5.7.17無料インストール版の基本設定チュートリアルについて(画像とテキスト付き)

データベース アプリケーションは、アプリケーション システムに不可欠な部分です。リレーショナル デー...

HTML と CSS を書くための 6 つの最も効果的な方法

この記事では、効率を向上させ、時間を節約することを願って、最も効果的な 6 つの方法を紹介します。 ...

Vue.js スタイルレイアウト Flutter ビジネス開発共通スキル

シャドウスタイルにおけるフラッターとCSSの対応UIによって指定されたCSSスタイル 幅: 75px...

HTMLの基本概念の詳細な説明

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 •HTML...

Tudou.com フロントエンドの概要

1. 分業とプロセス<br />Tudou.comでは、プロジェクト開発が中核であり、誰...

MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?

私は最近新しい会社に入社したのですが、データベース設計にいくつか小さな問題があることに気付きました。...

HTML における rel="nofollow" の役割と rel 属性の使用を分析する

リンクに rel="nofollow" 属性を追加すると、検索エンジンにこの接続...

MySQLにインデックスを追加しても効果がないいくつかの状況について簡単に説明します。

インデックスを追加すると、クエリの効率が向上します。インデックスを追加するということは、ドキュメント...

人気の宇宙飛行士ウォッチフェイスをJavaScriptで実装するための完全なコード

1. エフェクト表示JavaScript で書かれた宇宙飛行士のウォッチフェイス。 http://x...

Ubuntu Linuxシステムをインストールするときにハードディスクをパーティション分割する最も合理的な方法の詳細な説明

Windows または Linux オペレーティング システムをインストールするかどうかに関係なく、...