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