解决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 相关文章推荐
ExtJS Window 最小化的一种方法
Nov 18 Javascript
js document.write()使用介绍
Feb 21 Javascript
node.js中的console.log方法使用说明
Dec 09 Javascript
JS中call/apply、arguments、undefined/null方法详解
Feb 15 Javascript
JavaScript新增样式规则(推荐)
Jul 19 Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
Dec 02 Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 Javascript
React Native实现进度条弹框的示例代码
Jul 17 Javascript
浅谈使用React.setState需要注意的三点
Dec 18 Javascript
页面点击小红心js实现代码
May 26 Javascript
vue使用codemirror的两种用法
Aug 27 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数组转成json格式的方法
2015/03/09 PHP
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
为什么JavaScript没有块级作用域
2016/05/22 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
JS实现密码框效果
2020/09/10 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python通过ssh-powershell监控windows的方法
2015/06/02 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
大学生物业管理求职信
2013/10/24 职场文书
实习单位接收函模板
2014/01/10 职场文书
安全生产检讨书
2014/01/21 职场文书
婚礼主持结束词
2014/03/13 职场文书
个人安全承诺书
2014/05/22 职场文书
中职招生先进个人材料
2014/08/31 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
校园运动会广播稿
2015/08/19 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python