有个关于vue 监听数组对象属性变化的问题想请教下大家?谢谢?

我有个数组对象goods_list_data

我平时操作这个数组对象 修改值都是

this.goods_list_data[index].price_count = price_count

直接去进行修改的

我现在想用watch 监听这个数组对象的某个值的变化,比如this.goods_list_data[index].price_count

watch:{
  'orde_data_obj': (newV, oldV) => {
      console.log("watch", newV, oldV)
  },
},

但是我好像不管怎么写,也监听不到变化,甚至直接监听这个数组对象也没反应,不知道是哪里有问题?

阅读 2.3k
2 个回答

使用 $set 去变更对象数组内的属性。

示例代码:

<template>
  <div>
    <button @click="changeListObjData">点击变更</button>
    <p>{{list}}</p>
  </div>
</template>
<script>
export default {
  data(){
    return {
      list: [{ value: 0 },{ value: 100 },{ value: 10 }]
    }
  },
  watch:{
    list(val){
      console.log('list changed:', val)
    }
  },
  methods:{
    changeListObjData(){
      const index = Math.floor(Math.random() * 3) 
      const newValue = (Math.random() * 100).toFixed(2)
      this.$set(this.list[index], 'value', newValue)
      // 或者把对应下标的对象整个更新
      // this.$set(this.list, index, { value: newValue })
    }
  }
}

阅读更多

$set - API — Vue.js
对于数组 - 深入响应式原理 — Vue.js

直接监听监听不到是因为你改变的是数组子元素的属性,这属于深度监听,需要加上deep: true

watch:{
    list:{
        handler(val){
              console.log('list changed:', val)
        },
        deep: true
    }
}

对于数组子元素的属性,这种复杂表达式,可以使用$watch的getter函数进行监听
https://cn.vuejs.org/api/comp...

this.$watch(() => this.goods_list_data[i].price_count, function(){
    console.log(111)
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题