解决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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 Javascript
javascript一元操作符(递增、递减)使用示例
Aug 07 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
Jquery中$.post和$.ajax的用法小结
Apr 28 Javascript
Bootstrap使用基础教程详解
Sep 05 Javascript
js 原型对象和原型链理解
Feb 09 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
Feb 27 Javascript
学习node.js 断言的使用详解
Mar 18 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
vue select 获取value和lable操作
Aug 28 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验证session无效的解决方法
2014/11/04 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
prototype class详解
2006/09/07 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
使用js实现数据格式化
2014/12/03 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JS获取子窗口中返回的数据实现方法
2016/05/28 Javascript
响应式表格之固定表头的简单实现
2016/08/26 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
JS实现的文字间歇循环滚动效果完整示例
2018/02/13 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
python filecmp.dircmp实现递归比对两个目录的方法
2020/05/22 Python
为什么称python为胶水语言
2020/06/16 Python
Django如何批量创建Model
2020/09/01 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
通信专业个人自我鉴定
2013/10/21 职场文书
采购主管的岗位职责
2013/12/17 职场文书
雪山饭庄的创业计划书范文
2014/01/18 职场文书
幼儿园门卫制度
2014/01/29 职场文书
健康状况证明书
2014/11/26 职场文书
优秀少先队员事迹材料
2014/12/24 职场文书
英文邀请函
2015/02/02 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP