ホームページ  >  に質問  >  本文

Vue Compute() がリアクティブ マップで起動しない

最初は空のマップの周囲に reactivity があります: const map =reactive({}); と、マップが次のようになったかどうかを示す calculationキー「key」: const mapContainsKeyCompulated = Computed(() => map.hasOwnProperty("key"))。マップを変更しても計算が更新されません。

私は 1 日この問題で立ち往生していましたが、なんとか問題を示す最小限の例を思いつきました。

リーリー

スタックオーバーフローの回答と Vue のドキュメントをたくさん読みましたが、まだ理解できません。

編集: @estus-flask が述べたように、これは 3.2.46 で修正された VueJS のバグです。

P粉127901279P粉127901279205日前321

全員に返信(1)返信します

  • P粉668146636

    P粉6681466362024-03-28 00:34:51

    Vue のリアクティブには、リアクティブ オブジェクト メソッドの明示的なサポートが必要です。 hasOwnProperty は非常に低レベルであるため、しばらくサポートされていません。サポートがなければ、map.hasOwnProperty(key) は非リアクティブな元のオブジェクトの key にアクセスしようとし、リアクティブはトリガーされないため、最初の computation< /code> この呼び出しでは、次回 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) が反応性をトリガーすると予想されます。

    返事
    0
  • キャンセル返事