Vue が配列の変更を検出できないのはなぜですか?その理由は次のとおりです
問題の説明: Vue は Object.defineProperty を通じてデータ変更を検出します。そのため、配列の追加操作を監視できないことは理解できます。この検出とバインド操作はコンストラクター内のすべてのプロパティに対して行われているためです。
ただし、公式テキスト: JavaScript の制限により、Vue は次の変更された配列を検出できません:
インデックスを使用して項目を直接設定する場合、たとえば: vm.items[indexOfItem] = newValue
長さを変更する場合例: vm.items.length = newLength
この文はどういう意味ですか? Object.defineProperty がインデックス プロパティを通じてプロパティのアクセサー プロパティを設定できることをテストしましたが、なぜそれを監視できないのでしょうか?
配列の長さは可変であるため、長さが 5 であってもインデックス 4 を持たない可能性があるとフォーラムの一部の人が言っています。長さを変更する場合、この答えはどこから来たのかを尋ねたいと思います。新しい要素は最後に追加され、その値は未定義ですが、その値はインデックスを介して取得することもできます。なぜ「インデックス 4 を持たない可能性がある」と呼ばれるのでしょうか。
配列の長さはわかったので、すべての要素を走査して set を追加し、インデックス属性を介してすべての要素にアクセスできないのはなぜでしょうか?同時にビューを更新できるのでしょうか?
強いて言えば、パフォーマンスの問題を考慮すると、要素の内容に意味のある値が 4 つしかないが、長さが確かに 1000 であると仮定すると、1000 個の要素に対して検出操作を実行することは不可能です。しかし、公式はそれが JS の制限によるものだと言いました。この制限が何なのか知りたいです。この問題の解決にご協力いただき、誠にありがとうございます
この問題に直面して、私が言いたいのは、まず第一に、長さが 1000 の配列であっても要素が 4 つだけであるということは必ずしもパフォーマンスに影響を与えるわけではないということです。 js for ループに加えて、データの走査には forEach、map、filter、some などが含まれます。ただし、for ループ (for、for...of) を除き、他の走査はすべてキー値の走査です。つまり、これらの 4 つの要素を除いて、外側の空のスペースは走査されないため、パフォーマンスの低下はありません。ループ本体に操作がない場合、パフォーマンスへの影響は無視できるためです。以下は次のような配列です。長さは 10000 ですが、要素は 2 つだけです。 for と forEach のトラバーサルをそれぞれ使用した結果: var arr = [1]; arr[10000] = 1
function a(){
console.time()
for(var i = 0;i<arr.length;i++)console.log(1)
console.timeEnd()
}
a(); //default: 567.1669921875ms
a(); //default: 566.2451171875ms
function b(){
console.time()
arr.forEach(item=>{console.log(2)})
console.timeEnd()
}
b(); //default: 0.81982421875ms
b(); //default: 0.434814453125ms
次に、私が言いたいのは、この制限が何なのかわからないということです (⇀‸↼‶) ╮( •́ω•̀ )╭
Object.defineProperty() メソッドが直接定義するものです。オブジェクトの新しいプロパティを追加するか、オブジェクトの既存のプロパティを変更して、オブジェクトを返します。配列のインデックスも属性なので、配列要素の変更を監視できます
var arr = [1,2,3,4] arr.forEach((item,index)=>{ Object.defineProperty(arr,index,{ set:function(val){ console.log('set') item = val }, get:function(val){ console.log('get') return item } }) }) arr[1]; // get 2 arr[1] = 1; // set 1
しかし、要素を追加すると、この新しい属性を監視していないため、リッスン イベントはトリガーされません。属性を削除する場合は true。
主な質問に戻ります。配列は監視できるのに、添字が対応するものであっても、vue は vm.items[indexOfItem] = newValue
によって引き起こされる配列要素の変更を検出できないのはなぜですか。要素が存在し、監視されていますか?
この問題を明確にするために、vue のソースコードでテストしてみました。以下は vue によるデータ監視のソースコードです: vm.items[indexOfItem] = newValue
导致的数组元素改变呢,哪怕这个下标所对应的元素是存在的,且被监听了的?
为了搞清楚这个问题,我用vue的源码测试了下,下面是vue对数据监测的源码:
可以看到,当数据是数组时,会停止对数据属性的监测,我们修改一下源码:
使数据为数组时,依然监测其属性,然后在defineReactive函数中的get,set打印一些东西,方便我们知道调用了get以及set。这里加了个简单判断,只看数组元素的get,set
然后写了一个简单案例,主要测试使用vm.items[indexOfItem] = newValue
データが配列の場合、データ属性の監視が停止することがわかります。ソース コードを変更します:
データを次のように作成します。配列を読み取るときに、引き続きそのプロパティを監視し、get と set が呼び出されたことを知ることができるように、defineReactive 関数の get と set で何かを出力します。ここに簡単な判断を追加します。配列要素の取得、set
次に、主に vm.items[indexOfItem] = newValue
を使用して配列要素を変更できるかどうかをテストする簡単なケースを作成しました。レンダリング ページ
実行ページ
最初に set が実行され、次にデータが更新され、ページが再レンダリングされ、配列が 2 回走査されていることがわかります。
でも! ! !配列は確かに応答性が高くなりました。これは、js 構文関数が配列の監視を制限しないことを意味します。
ここでは長さ 3 の配列を使用してテストしています。配列の長さを 9 に増やすと
、get を 18 回実行した後でも、要素をクリックしても配列が 2 回走査されていることがわかります。 、レンダリング時にも 2 回トラバースされます。
上記の実験により、vue で配列をレスポンシブに更新できるという結論になりましたが、なぜ Youda がこの機能を追加しなかったのかわかりません。知っている専門家がいたら教えてください。
関連記事: 関連動画:配列変更検出 - Wheat Academy Vue.js ビデオ チュートリアル
以上がVue が配列の変更を検出できないのはなぜですか?その理由は次のとおりですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
