最初は空のマップの周囲に reactivity があります: const map =reactive({});
と、マップが次のようになったかどうかを示す calculationキー「key」: const mapContainsKeyCompulated = Computed(() => map.hasOwnProperty("key"))
。マップを変更しても計算が更新されません。
私は 1 日この問題で立ち往生していましたが、なんとか問題を示す最小限の例を思いつきました。
リーリースタックオーバーフローの回答と Vue のドキュメントをたくさん読みましたが、まだ理解できません。
Map:{{map}}
(行 14) は正常に更新されるのでしょうか? 編集: @estus-flask が述べたように、これは 3.2.46 で修正された VueJS のバグです。
P粉6681466362024-03-28 00:34:51
Vue のリアクティブには、リアクティブ オブジェクト メソッドの明示的なサポートが必要です。 hasOwnProperty
は非常に低レベルであるため、しばらくサポートされていません。サポートがなければ、map.hasOwnProperty(key)
は非リアクティブな元のオブジェクトの key
にアクセスしようとし、リアクティブはトリガーされないため、最初の computation< /code> この呼び出しでは、次回
map
が変更されたときに起動できるリスナーは設定されません。
この問題を解決する 1 つの方法は、最初に key
(別の回答で提案されているように) を定義することです。これは、Vue 2 および 3 でリアクティブを機能させる従来の方法です。
リーリー
key プロパティにアクセスすることです:
リーリー
in 演算子を使用することです。 Vue 3 は
Proxy を使用して応答するため、プロパティが
has トラップ経由でアクセスされていることを検出できます:
リーリー
hasOwnProperty のサポートは最近 3.2.46
に追加されたため、質問内のコードは最新の Vue バージョンで動作するはずです。
map は実際の地図ではありません。
Map を使用する場合、これはどの Vue 3 バージョンでも異なります。Vue はそれをサポートしており、
map.has(key) が反応性をトリガーすると予想されます。