解决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 相关文章推荐
浅谈Javascript嵌套函数及闭包
Nov 09 Javascript
JQuery实现防止退格键返回的方法
Feb 12 Javascript
简单实现异步编程promise模式
Jul 31 Javascript
js为什么不能正确处理小数运算?
Dec 29 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
微信小程序 火车票查询实例讲解
Oct 17 Javascript
javascript删除html标签函数cIsHTML
Jan 09 Javascript
微信小程序学习之数据处理详解
Jul 05 Javascript
vue-cli中的webpack配置详解
Sep 25 Javascript
JS数组的常用10种方法详解
May 08 Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 Javascript
Node与Python 双向通信的实现代码
Jul 16 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利用cookie实现自动登录的方法
2014/12/10 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
2016/01/04 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
js CSS操作方法集合
2008/10/31 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
使用bootstrap3开发响应式网站
2016/05/12 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
vue.js的安装方法
2017/05/12 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
JS 正则表达式验证密码、邮箱格式的实例代码
2018/10/28 Javascript
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Django中处理出错页面的方法
2015/07/15 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
英国最红的高街时尚品牌:Topshop
2016/08/05 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
Sql面试题
2013/03/20 面试题
编程输出如下图形
2013/11/24 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
新员工培训个人的自我评价
2013/10/09 职场文书
党员违纪检讨书
2015/05/05 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
合作合同协议书
2016/03/21 职场文书