解决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 联动日历实现代码
May 31 Javascript
基于javascipt-dom编程 table对象的使用
Apr 22 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
浅谈javascript中return语句
Jul 15 Javascript
js实现点击按钮弹出上传文件的窗口
Dec 23 Javascript
基于vue.js实现侧边菜单栏
Mar 20 Javascript
javaScript之split与join的区别(详解)
Nov 08 Javascript
前后端常见的几种鉴权方式(小结)
Aug 04 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
Oct 23 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
Feb 07 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 Javascript
解决vue watch数据的方法被调用了两次的问题
Nov 07 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采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
php将图片文件转换成二进制输出的方法
2015/06/10 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
2019/04/08 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JS基于Mootools实现的个性菜单效果代码
2015/10/21 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JavaScript静态作用域和动态作用域实例详解
2019/06/17 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
Python抓取京东图书评论数据
2014/08/31 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python3离线安装Requests模块问题
2019/10/13 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Python 爬虫性能相关总结
2020/08/03 Python
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
五年级英语教学反思
2014/01/31 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
学历公证委托书
2014/04/09 职场文书
父母寄语大全
2014/04/12 职场文书
农村党员对照检查材料
2014/09/24 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
奔腾年代观后感
2015/06/09 职场文书
运动会100米广播稿
2015/08/19 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python