解决Vue2.0 watch对象属性变化监听不到的问题


Posted in Javascript onSeptember 11, 2018

问题

很早之前就遇到一个问题,父组件向子组件传值,子组件监听传入对象的某个属性。发现子组件使用deep watch都不能观察到对象中属性的变化,今天终于找到为啥出现这种问题和解决办法了。

解决

为啥出现这种问题?受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。

请参照https://v1-cn.vuejs.org/guide/reactivity.html

解决方式:

通过vue的this.$set(object, key, value)方法

通过Object.assign()重新创建一个对象, 例如this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

代码实例

<template>
 <div>
 <p @click="fun1" style="color: blue">方式一</p>
 <p @click="fun2" style="color: blue">方式二</p>
 </div>
</template>

<script>
export default {
 data () {
 return {
  p: {a: 1}
 }
 },
 methods: {
 fun1 () {
  console.log('click 1111')
  // this.p.b = 2 // 通过点方法赋值,发现观察不到p的变化
  this.$set(this.p, 'b', 2) // 第一种解决方式,可以查看日志看到已经监听到了变化
 },
 fun2 () {
  console.log('click 2222')
  this.p = Object.assign({}, this.p, {c: 3})
 }
 },
 watch: {
 p: {
  handler (cval, oval) {
  console.log('--------')
  console.log(cval, oval)
  },
  deep: true
 }
 }
}
</script>

<style>

</style>

总结

个人推荐使用第二种解决方式,代码写起来更优雅。第一种解决方式如果有多个值会出现,多行$set()语句。

以上这篇解决Vue2.0 watch对象属性变化监听不到的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
分享几个超级震憾的图片特效
Jan 08 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 Javascript
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
Oct 11 Javascript
js实现拖拽效果
Feb 12 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
JavaScript如何动态创建table表格
Aug 02 Javascript
jQuery选择器基础入门教程
May 10 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
Jan 04 Javascript
js实现拖拽上传图片功能
Aug 01 Javascript
JavaScript实现区块链
Mar 14 Javascript
详细分析Node.js 模块系统
Jun 28 Javascript
JavaScript高级程序设计之基本引用类型
Nov 17 Javascript
详解webpack模块加载器兼打包工具
Sep 11 #Javascript
webpack css加载和图片加载的方法示例
Sep 11 #Javascript
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 #Javascript
webpack的CSS加载器的使用
Sep 11 #Javascript
JavaScript基础教程之如何实现一个简单的promise
Sep 11 #Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
Sep 11 #Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
Sep 11 #Javascript
You might like
php GD绘制24小时柱状图
2008/06/28 PHP
php 静态变量的初始化
2009/11/15 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
Javascript浅谈之this
2013/12/17 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
用原生js做单页应用
2017/01/17 Javascript
js实现随机点名小功能
2017/08/17 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
python遍历文件夹并删除特定格式文件的示例
2014/03/05 Python
详解Python中for循环的使用
2015/04/14 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python格式化输出%s和%d
2018/05/07 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python 面向对象部分知识点小结
2020/03/09 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
将tf.batch_matmul替换成tf.matmul的实现
2020/06/18 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
妈妈的账单教学反思
2014/02/06 职场文书
经典婚礼主持词
2014/03/13 职场文书
重阳节活动总结
2014/08/27 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
Nginx如何配置根据路径转发详解
2022/07/23 Servers