Vue不能watch数组和对象变化解决方案

 更新时间:2022年11月04日 08:52:47   作者:Krryblog  
这篇文章主要为大家介绍了Vue不能watch数组和对象变化解决方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Vue 能监听数组的情况

Vue 监听数组和对象的变化(vue2.x)

vue 实际上可以监听数组变化,比如:

直接 = 赋值

data () {
  return {
    watchArr: [],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    this.watchArr = [1, 2, 3];
  }, 1000);
},

再如使用 splice(0, 2, 3) 从数组下标 0 删除两个元素,并在下标 0 插入一个元素 3:

data () {
  return {
    watchArr: [1, 2, 3],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    this.watchArr.splice(0, 2, 3);
  }, 1000);
},

push、unshift、pop 数组也能够监听到

Vue 无法监听数组变化

但是,数组在下面两种情况无法监听:

利用索引直接设置一个数组项时,例如:arr[indexOfItem] = newValue;

修改数组的长度时,例如:arr.length = newLength;

举例无法监听数组变化的情况

利用索引直接修改数组值

data () {
  return {
    watchArr: [{
      name: 'krry',
    }],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    this.watchArr[0].name = 'xiaoyue';
  }, 1000);
},

修改数组的长度

长度大于原数组就将后续元素设置为 undefined

长度小于原数组就将多余元素截掉

data () {
  return {
    watchArr: [{
      name: 'krry',
    }],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    this.watchArr.length = 5;
  }, 1000);
},

上面的 watchArr 变成

Vue 无法监听数组变化的解决方案

this.$set(arr, index, newVal);
data () {
  return {
    watchArr: [{
      name: 'krry',
    }],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    this.$set(this.watchArr, 0, {name: 'xiaoyue'});
  }, 1000);
},

使用数组 splice 方法可以监听,例子上面有

使用临时变量直接赋值的方式,原理与直接赋值数组一样

data () {
  return {
    watchArr: [{
      name: 'krry',
    }],
  };
},
watch: {
  watchArr (newVal) {
    console.log('监听:' + newVal);
  }
},
created () {
  setTimeout(() => {
    let temp = [...this.watchArr];
    temp[0] = {
      name: 'xiaoyue',
    };
    this.watchArr = temp;
  }, 1000);
},

Vue 监听对象

Vue 可以监听直接赋值的对象

this.watchObj = {name: 'popo'};

但是 Vue 不能 直接 监听对象属性的添加、修改、删除

Vue 设置监听对象

使用this.$set(object, key, value)、this.$delete(object, key)

使用深度监听 deep: true,只能监听原有属性的变化,不能监听新增、删除的属性

mounted () {
  // 这里使用深度监听 blog 对象的属性变化,会触发 getCatalog 方法
  this.$watch('blog', this.getCatalog, {
    deep: true
    // immediate: true // 是否第一次触发
  });
},

watch: {
  obj: {
    // 这里深度监听变化,直接触发下面方法
    handler(curVal, oldVal) {
      // TODO
    },
    deep: true,
    immediate: true // 是否第一次触发
  }
}

使用this.$set(obj, key, val)来新增属性,this.$delete(object, key)来删除属性

无法使用 this.$set 监听修改原有属性;可以使用深度监听 deep: true,可以直接以 obj.key 的方法来设置原有属性

this.$set(this.watchObj, 'age', 124);
this.$delete(this.watchObj, 'age')

delete this.watchObj[‘name']//(Vue 无法监听 delete 关键字来删除对象属性)

使用 Object.assign 方法,直接赋值的原理监听(最推荐的方法)

this.watchObj = Object.assign({}, this.watchObj, {
  name: 'xiaoyue',
  age: 15,
});

直接 watch obj.key 监听某个值的变化

watch: {
  'obj.name'(curVal, oldVal) {
    // TODO
  }
}

以上就是Vue不能watch数组和对象变化解决方案的详细内容,更多关于Vue watch数组对象变化的资料请关注脚本之家其它相关文章!

相关文章

  • elementui实现表格(el-table)默认选中功能

    elementui实现表格(el-table)默认选中功能

    这篇文章主要介绍了elementui实现表格(el-table)默认选中功能,本文给大家分享实现思路结合实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2024-07-07
  • Vue打包上线之后部分CSS不生效问题的解决办法

    Vue打包上线之后部分CSS不生效问题的解决办法

    在vue项目中开发环境的样式没问题,但是打包上线后,样式不生效,下面这篇文章主要给大家介绍了关于Vue打包上线之后部分CSS不生效问题的解决办法,需要的朋友可以参考下
    2022-12-12
  • 详解Vue.js之视图和数据的双向绑定(v-model)

    详解Vue.js之视图和数据的双向绑定(v-model)

    本篇文章主要介绍了Vue.js之视图和数据的双向绑定(v-model),使用v-model指令,使得视图和数据实现双向绑定,有兴趣的可以了解一下
    2017-06-06
  • vue在线预览word、excel、pdf、txt、图片的方法实例

    vue在线预览word、excel、pdf、txt、图片的方法实例

    最近工作中遇到了一个需要在线预览文件的需求,所以这篇文章主要给大家介绍了vue在线预览word、excel、pdf、txt、图片的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Vue Element前端应用开发之前端API接口的封装

    Vue Element前端应用开发之前端API接口的封装

    对整个系统来说,一般会有很多业务对象,而每个业务对象的API接口又有很多。我们这个VUE+Element 前端应用就是针对ABP框架的业务对象,因此前端的业务对象接口也是比较统一的,那么可以考虑在前端中对后端API接口调用进行封装,引入ES6的方式进行前端API的抽象简化。
    2021-05-05
  • Vue中的验证登录状态的实现方法

    Vue中的验证登录状态的实现方法

    这篇文章主要介绍了Vue中的验证登录状态的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • vue el-select绑定对象时,回显内容不正确,始终是最后一项的解决

    vue el-select绑定对象时,回显内容不正确,始终是最后一项的解决

    这篇文章主要介绍了vue el-select绑定对象时,回显内容不正确,始终是最后一项的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Vue2 Element description组件列合并详解

    Vue2 Element description组件列合并详解

    在使用Vue的时候经常会涉及到表格的列合并,下面这篇文章主要给大家介绍了给大家Vue2 Element description组件列合并的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • vue父组件中获取子组件中的数据(实例讲解)

    vue父组件中获取子组件中的数据(实例讲解)

    下面小编就为大家带来一篇vue父组件中获取子组件中的数据(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Vue props中Object和Array设置默认值操作

    Vue props中Object和Array设置默认值操作

    这篇文章主要介绍了Vue props中Object和Array设置默认值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论