问题 Vue是否支持Map和Set数据类型的反应性?


Vue.js的文档提到了智能自动更改跟踪 普通的Javascript对象

当您将纯JavaScript对象作为其数据选项传递给Vue实例时,Vue.js将遍历其所有属性并使用Object.defineProperty将它们转换为getter / setter。

自Javascript以来 Map 和 Set 数据类型旨在与其内置使用 get/set 方法,我如何让Vue跟踪内部状态的调用(因此,更改) Maps和 SetS'


11713
2018-05-10 05:42


起源



答案:


Vue.js不支持反应 Map 和 Set 数据类型(还是?)。

功能票 有一些讨论和这个工作(由用户“inca”):

Vue无法观察到集合和贴图。为了使用那些 -   无论是在... v-for,或计算属性,方法,观察者,   模板表达式等 - 您需要创建一个可序列化的副本   这个结构并将其暴露给Vue。这是一个天真的例子   使用一个简单的计数器为Vue提供信息 Set 是   更新:

data() {
  mySetChangeTracker: 1,
  mySet: new Set(),
},

computed: {
  mySetAsList() { 
    // By using `mySetChangeTracker` we tell Vue that this property depends on it,
    // so it gets re-evaluated whenever `mySetChangeTracker` changes
    return this.mySetChangeTracker && Array.from(this.mySet);
  },
},

methods: {
  add(item) {
    this.mySet.add(item);
    // Trigger Vue updates
    this.mySetChangeTracker += 1;
  }
}

这说明了一种有点hacky但100%工作的制作方法   不可观察的数据反应。不过,在现实世界的情况下,我最终了   使用集合/地图的序列化版本(例如,您可能想要   在localstorage中存储集合/映射的修改版本   无论如何序列化它们,所以不涉及人工计数器/黑客。


9
2017-08-01 15:00