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

推薦する

1つのコマンドで、シェルの読み取りコマンドの共通パラメータを理解できます。

Shell で受信パラメータを受信する方法は 2 つあることがわかっています。 1 つはスクリプト...

CSS3は、変換変形とイベントを組み合わせて扇形のナビゲーションを完成させます。

この場合、transition という単語を間違って書いたため、午後中ずっとそれに取り組みました。本...

mysql 簡単な操作例を表示

この記事では、例を挙げて mysql show 操作について説明します。ご参考までに、詳細は以下の通...

フロントエンドが習得すべき、複数列の等高レイアウトを実現するための CSS テクニック

1. はじめにページを作成しているときに、複数列のレイアウトに遭遇することがあります。各列の内容が異...

IE8 互換性について: X-UA-compatible 属性の説明

問題の説明:コードをコピーコードは次のとおりです。 <meta http-equiv=&quo...

.NETCore Dockerはコンテナ化とプライベートイメージリポジトリ管理を実装します

1. Dockerの紹介Docker は Linux オペレーティングシステムの一部の機能をベースに...

Docker で Springboot プロジェクトを実行する実装

導入: springboot プロジェクトを実行する Docker の構成は実は非常にシンプルで、L...

Linuxグループの基礎知識ポイントまとめ

1. Linuxグループの基本紹介Linux では、すべてのユーザーはグループに所属する必要があり、...

フロントエンドAIカットのコツ(体験談)

AI 画像の切り取りは PS と連携する必要があります。まず、スライスするレイヤーを選択し、それを...

CSS でレスポンシブ レイアウトを実装する方法

CSS でレスポンシブ レイアウトを実装するレスポンシブレイアウトは非常にハイエンドで難しいように思...

Vueはvueメタ情報を使用して各ページのタイトルとメタ情報を設定します。

title: vue は vue-meta-info を使用して各ページのタイトルとメタ情報を設定...

Windows Server 2016 リモート デスクトップ サービスの構成とライセンスのアクティブ化 (2 ユーザー)

Server 2016 のリモート デスクトップ接続のデフォルト数は 2 ユーザーです。2 人以上...

MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...

MySqlサブクエリINの実装と最適化

目次IN が遅いのはなぜですか? INとEXISTSのどちらが速いでしょうか?効率を向上させるにはど...

Linuxコマンドのファイル上書きとファイル追加の詳細な説明

1. コマンド > と >> の違いコマンド>: ファイルが存在する場合は、...