解决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 相关文章推荐
IE8中动态创建script标签onload无效的解决方法
Dec 22 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
Sep 17 Javascript
实例代码讲解jquery easyui动态tab页
Nov 17 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
Mar 10 Javascript
Svg.js实例教程及使用手册详解(一)
May 16 Javascript
JSONP跨域请求
Mar 02 Javascript
Vue.js组件通信的几种姿势
Oct 23 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
May 13 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
Vue SSR 即时编译技术的实现
May 06 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 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
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
深入讲解PHP的对象注入(Object Injection)
2017/03/01 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP7内核之Reference详解
2019/03/14 PHP
PHP通过文件保存和更新信息的方法分析
2019/09/12 PHP
arguments对象
2006/11/20 Javascript
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
关于RequireJS的简单介绍即使用方法
2016/10/20 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
Vue中的v-for指令不起效果的解决方法
2018/09/27 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
详解node登录接口之密码错误限制次数(含代码)
2019/10/25 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
跟老齐学Python之深入变量和引用对象
2014/09/24 Python
详解Python的Twisted框架中reactor事件管理器的用法
2016/05/25 Python
Php多进程实现代码
2018/05/07 Python
Python 加密与解密小结
2018/12/06 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
美国一家运动专业鞋类零售商:Warehouse Shoe Sale(WSS)
2018/03/28 全球购物
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
旅游管理毕业生自荐信范文
2014/03/19 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
应届生求职信
2014/05/31 职场文书
cf战队宣传语
2015/07/13 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python