关于如何监控vuex里对象的属性变化

本文探讨如何在Vuex中监控并响应msgList对象的属性变化,特别是当用户发送消息时更新对话记录。通过使用Object.assign()方法来确保对象的更新能够被Vuex检测到,从而实现数据的正确响应。在mutations中,使用Object.assign()创建新对象,然后在组件的computed属性中获取响应式msgList,并在watch中监听其变化以执行相应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个这样的数据结构,在store里有一个msgList的对象,属性是用户的username,要在每次这个用户发出一条消息记录时push一个新元素进去,并响应这个变化,同时更新当前对话记录。
在这里插入图片描述
https://cn.vuejs.org/v2/guide/list.html#
这是官方写的对于数组,对象属性更新检测的注意事项。我自己使用了其中的Object.assign(),来实现响应。

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

官方要求我们用这种写法:

vm.userProfile = Object.assign({}, vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})

是因为如果使用下列这种写法,只是复制了源目标的值,引用地址并没有变化,本质还是属性的修改,无法检测。而上面写法相当于换了一个对象,自然就能检测到。

Object.assign(vm.userProfile, {
  age: 27,
  favoriteColor: 'Vue Green'
})

预备知识讲完,进入正题。
在mutations里先按照普通写法,将userName作为一个对象的一个属性,并给属性赋值一个被放到数组里的payload对象。

const state={
    msgList:{},//所有消息集合
};
const mutations={
updateMsgList(state,payload){
	console.log(payload)
	if(payload.bySelf===true){//我方发给对方 存储发送消息的To 作为username
		if(!state.msgList[
在 Vue.js 中,如果你想监听 data 中复杂对象(如对象字面量、数组或嵌套对象)的属性变化,Vue 的数据绑定机制本身并不能直接处理这种深层次的变化检测。不过,你可以通过以下几种方式来实现: 1. **Vuex** (状态管理库): 如果你在组件中操作的数据需要共享并且有复杂的变更跟踪需求,可以考虑使用 Vuex。它允许你在 store 中创建响应式的 state,然后通过 mutations 或 actions 来更新。 2. **Object.defineProperty()**: 这是一个 JavaScript 动手的方式,通过给对象的每个属性添加 `getter` 和 `setter`,从而触发对应的回调函数。例如: ```javascript let obj = { count: { value: 0, get, set } }; Object.defineProperty(obj.count, 'value', { get: function() { return this._count; }, set: function(newVal) { if (newVal !== this._count) { this._count = newVal; // 触发监听器 this.$emit('count-change', newVal); } } }); ``` 这 `this.$emit` 可以触发自定义事件,让你在模板监听这个变化。 3. **深度监听插件**: 有一些第三方插件,比如 `vue-deep-watch` 或 `vue-property-decorator`,可以帮助你在 Vue 实例上方便地监视复杂对象的深层属性变化。 4. **计算属性(Computed Properties)**: 尽管不是实时监听,但可以设置计算属性来基于其他数据动态计算值,并自动更新视图。 记得在监听时避免不必要的性能开销,特别是在大规模复杂数据的情况下。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值