解决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 相关文章推荐
完美解决JS中汉字显示乱码问题(已解决)
Dec 27 Javascript
深入理解JavaScript系列(15) 函数(Functions)
Apr 12 Javascript
Javascript实现飞动广告效果的方法
May 25 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
jquery实现通用的内容渐显Tab选项卡效果
Sep 07 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
Oct 24 Javascript
jquery 多个radio的click事件实例
Dec 03 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
Aug 23 Javascript
iview form清除校验状态的实现
Sep 19 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
cypress测试本地web应用
Jun 01 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
Laravel 5 学习笔记
2015/03/06 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
JavaScript中instanceof与typeof运算符的用法及区别详细解析
2013/11/19 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
vue实现中部导航栏布局功能
2019/07/30 Javascript
微信小程序实现左侧滑动导航栏
2020/04/08 Javascript
JQuery事件委托(适用于给动态生成的脚本元素添加事件)
2020/02/01 jQuery
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
心理健康课教学反思
2014/02/13 职场文书
请假条标准格式规范
2014/04/10 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
校本教研活动总结
2014/07/01 职场文书
幼儿生日活动方案
2014/08/27 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
三峡导游词
2015/01/31 职场文书
党员证明信
2015/06/19 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
python缺失值的解决方法总结
2021/06/09 Python
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python