解决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 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
jquery实现点击消失的代码
Mar 03 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
Javascript实现div层渐隐效果的方法
May 30 Javascript
基于jQuery实现Tabs选项卡自定义插件
Nov 21 Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 jQuery
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
彻底揭秘keep-alive原理(小结)
May 05 Javascript
详解Vue.js 响应接口
Jul 04 Javascript
vue-router为激活的路由设置样式操作
Jul 18 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
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
php常用数学函数汇总
2014/11/21 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
妙用Jquery的val()方法
2012/06/27 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
微信小程序 checkbox使用实例解析
2019/09/09 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
python实现excel读写数据
2021/03/02 Python
PyQt5每天必学之切换按钮
2020/08/20 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
html5新特性与用法大全
2018/09/13 HTML / CSS
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
接口可以包含哪些成员
2012/09/30 面试题
主题婚礼策划方案
2014/02/10 职场文书
事业单位考察材料范文
2014/12/25 职场文书
学生会任命书范本
2015/09/21 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers