让Vue响应Map或Set的变化

本文介绍了一种使Vue能够响应Set内部变化的方法。通过创建一个可序列化的追踪变量mySetChangeTracker,并利用Vue的计算属性mySetAsList,使得当Set发生变化时手动更新追踪变量的值,进而触发Vue的更新机制。

让Vue响应Map或Set的变化


问题背景

我想在vuexstate中使用map,这样可以使很多操作变得方便

const state = {
    all: new Map()
}

这样的写法是没有问题的,不会报错,state.all可以像正常的Map一样使用。
但是这里有一个问题,vue的响应式系统不支持MapSet,也就是说,当MapSet里面的元素变化时Vue追踪不到这些变化,因此无法做出响应。这样一来,页面上依赖all的元素也不会随all的变化而变化

解决方法

用户”inca”的回答
you need to create a serializable replica of this structure and expose it to Vue

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

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

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

解决方法是用一个可序列化的mySetChangeTracker来手动追踪变化
Vue追踪不到Set的变化,但是可以追踪到mySetChangeTracker的变化,所以当Set发生改变后,手动改变mySetChangeTracker的值就能让Vue知道我的数据发生了变化。

mySetAsList里面写入var x = this.mySetChangeTracker,这样一来当mySetChangeTracker更新后,mySetAsList就会做出响应

Vue.js 中处理地图数据并进行集合操作时,可以结合 JavaScript 的 `Set` 数据结构来实现高效的数据管理。`Set` 是一种集合类型,能够存储无重复值的元素,适合用于去重、交集、并集、差集等集合操作。通过 Vue响应式机制,可以将地图数据变化与视图更新紧密结合。 ### 使用 `Set` 进行地图数据去重 当处理地图上的标记点区域数据时,可能会出现重复的地理坐标标识符。使用 `Set` 可以轻松去除重复项: ```javascript const rawCoordinates = [ { lat: 40.7128, lng: -74.006 }, { lat: 34.0522, lng: -118.2437 }, { lat: 40.7128, lng: -74.006 }, // 重复 ]; const uniqueCoordinates = [...new Set(rawCoordinates.map(JSON.stringify))].map(JSON.parse); ``` 上述代码通过将对象序列化为字符串再存入 `Set`,确保了对象的唯一性。最终结果 `uniqueCoordinates` 是一个没有重复坐标的数组。 ### 使用 `Set` 进行集合运算 #### 并集(Union) ```javascript const setA = new Set([1, 2, 3]); const setB = new Set([3, 4, 5]); const union = new Set([...setA, ...setB]); // {1, 2, 3, 4, 5} ``` #### 交集(Intersection) ```javascript const intersection = new Set([...setA].filter(x => setB.has(x))); // {3} ``` #### 差集(Difference) ```javascript const difference = new Set([...setA].filter(x => !setB.has(x))); // {1, 2} ``` ### Vue.js 中的响应式集合操作 在 Vue 实例中,可以将 `Set` 实例作为数据属性的一部分。由于 Vue 不能自动追踪 `Set` 的变化,因此建议使用数组来保存数据,并在操作 `Set` 后更新数组以触发视图更新: ```javascript export default { data() { return { coordinates: [], }; }, methods: { addCoordinate(coord) { const coordStr = JSON.stringify(coord); const coordSet = new Set(this.coordinates.map(JSON.stringify)); if (!coordSet.has(coordStr)) { coordSet.add(coordStr); this.coordinates = [...coordSet].map(JSON.parse); } }, }, }; ``` 在上述示例中,`addCoordinate` 方法用于向 `coordinates` 数组中添加新的坐标点,并利用 `Set` 确保其唯一性。通过更新 `coordinates` 数组,Vue 会自动触发视图的重新渲染。 ### 注意事项 - Vue响应式系统无法直接追踪 `Set` 的变化,因此应使用数组作为 Vue 数据模型,并在操作 `Set` 后更新数组。 - 在处理复杂对象时,需要将对象转换为字符串(如使用 `JSON.stringify`)才能存入 `Set`,避免对象引用问题。 - 使用 `Set` 进行集合操作时,应确保数据结构的正确性和一致性,避免因数据格式不一致导致的错误。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值