解决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 文档碎片
Jul 13 Javascript
用jQuery toggleClass 实现鼠标移上变色
May 14 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
Jun 01 Javascript
JavaScript中的await/async的作用和用法
Oct 31 Javascript
微信小程序 共用变量值的实现
Jul 12 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
Angular ElementRef简介及其使用
Oct 01 Javascript
vue写h5页面的方法总结
Feb 12 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 Javascript
JavaScript如何使用插值实现图像渐变
Jun 28 Javascript
jQuery-App输入框实现实时搜索
Nov 19 jQuery
JavaScript设计模式之原型模式详情
Jun 21 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
深入PHP运行环境配置的详解
2013/06/04 PHP
php模拟post提交数据的方法
2015/02/12 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
Js基础学习资料
2010/11/23 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
Python脚本后台运行的几种方式
2015/03/09 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
BootStrap入门教程(三)之响应式原理
2016/09/19 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
python调用外部程序的实操步骤
2019/03/04 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
应征英语教师求职信
2013/11/27 职场文书
让世界充满爱演讲稿
2014/05/24 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电