位置: IT常识 - 正文

Vue2 watch监听对象的属性值变化(vue的watch监听)

编辑:rootadmin
Vue2 watch监听对象的属性值变化 文章目录前言一、错误分析二、如何监听一个对象整体的改变?三、如何监听对象中一个属性值的改变?四、如何组织对象避免监听失败总结前言

推荐整理分享Vue2 watch监听对象的属性值变化(vue的watch监听),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue监听watch监听全局对象,vue的watch监听props,vue watch监听vuex数据,vue的watch监听,vue的watch监听,vuewatch监听data里的数据,vue watch监听耗费性能,vue2 watch监听对象,内容如对您有帮助,希望把文章链接给更多的朋友!

昨天拿到一个任务需要自己写组件, 然后就遇到这个问题了. 父组件中, 我需要在鼠标选中多选表格的一行时将这一行的数据对象传入子组件, 显然这不是个异步操作, 但是子组件那边怎么都拿不到值, 子组件需要在created周期调用一堆函数, 函数里面需要用到这个传过来的表格数据对象. 但是在函数里怎么数据对象输出都是undefined, 我大概对我的watch做了4-5次改进, 都没有解决这个事情, 起初以为是没有深度监听, 然后认为是需要深度监听里把新对象里的每个值遍历赋值出来存储. 最后病急乱投医了直接觉得是createed周期太早了而取不到.

一、错误分析

首先我不应该把新值重新赋值到props的this.rawParams…额是个低级错误, 这违背了Vue类似MVVM的通信原则. 其次我在父组件里组织这个对象的方式是使用obj.xxx = xxx的方式, 这就是改变对象值, 会加大监听难度, 不过这篇也是围绕这点来说的.

我两天有一个猜想, props传值的时候直接传个新的对象(就是直接把一个做好的对象赋值到要传的变量), 和使用obj.xxx的格式慢慢组织对象后传入, 这两种办法在被子组件监听时是否会有区别? 正好今天遇到这个情况, 顺手试一下, 我把两种情况各分一个章节来说.

二、如何监听一个对象整体的改变?Vue2 watch监听对象的属性值变化(vue的watch监听)

这就是我说的第一种情况, 直接组织好对象, 把整个新对象传入. 直接赋值一个新的对象更加易于监听到, 这就像直接赋值了一个String或者什么别的类型的变量:

<!-- 父组件内 --><ebec030i-res-display :rawParams="rawParams"></ebec030i-res-display>//父组件事件//你就想一个方法触发这玩意儿就好了, 不写了...rowClick(row) { let temParams = {} temParams.会计科目 = row.value1 temParams.往来单位 = row.value2 temParams.管理编号 = row.value3 temParams.余额 = row.value4 this.rawParams = temParams},

直接传新对象的话可以像监听一个简单数据类型一样去监听, 当然, 待会会说到监听对象内值变化的监听方法, 你也可以用那个监听这个…只要你愿意.

// 子组件监听watch: { watchRawParams: { handler: function(newVal, oldVal) { console.log(newVal) console.log(oldVal) }, deep: true, immediate: true, },},三、如何监听对象中一个属性值的改变?

相比直接赋值新的对象, 监听一个值的变化牵扯到深浅拷贝, 现在要监听this.rawParams. 出于性能的考虑, Vue天生不支持检测对象里属性值本身的变化(可以做, 但是性能消耗大, 成本与用户收益不成正比), watch监听单个属性值的变化也需要做一些特殊的配置.

rowClick(row) { this.rawParams.会计科目 = row.value1 this.rawParams.往来单位 = row.value2 this.rawParams.管理编号 = row.value3 this.rawParams.余额 = row.value4},computed: { watchRawParams: function() { let obj = {} Object.keys(this.rawParams).forEach((key) => { obj[key] = this.rawParams[key] }) return obj }},watch: { watchRawParams: { handler: function(newVal, oldVal) { console.log(newVal) console.log(oldVal) }, deep: true, immediate: true, },},

话说我以前干过这种蠢事, 我把监听到的新值又赋值给props里的值, 然后各种崩…这不符合MVVM的规范(其实根本成功不了). 所以现在有两种选择是在data上开一个新值来接收监听完的值, 或者用computed来接收. 修改对象或者数组, 也就是我说的第二种情况时, watch监听的新值和旧值都会指向同一个原数据, 也就是浅拷贝. 仅针对数组或者对象来说, 浅拷贝结果的子对象如果发生改变会导致源数据一同改变, 进而影响其它指针上的浅拷贝. 而第二种情况即是在浅拷贝情况下对对象子对象的改动, 会影响到源数据继而影响其他指针上的浅拷贝结果. 导致的后果就是watch监听到的新值和旧值是一样的, 判定为不需要进行值变动处理方案, 这种时候不会执行watch里你规定的值变化处理方案, 连里面的输出都不会执行.

所以如果是这种情况, 需要手动深拷贝一个完全一样的待监听对象出来还要让他们时刻保持相同, computed无疑更加合适, 缓存机制让它仅仅在发生变动时参与计算, 可以保证深拷贝出的待监听对象与原待监听对象完全相同又完全隔离互不影响. 原理是把第二种方式转换为第一种方式, 直接由computed返回一个全新的数组来避免使用浅拷贝监听.

四、如何组织对象避免监听失败

不需要监听对象属性值变化(或者能组织新数组)就直接赋值做好的新数组, 参考第二章, 很多时候并不需要监听属性值变化, 尽量避免. 不能避免的需要监听对象属性值变化, 参考第三章使用深拷贝法.

总结

被坑惨了…今下午修这个组件修了一个多小时啊啊啊… 希望这篇文章对你有帮助.

本文链接地址:https://www.jiuchutong.com/zhishi/289768.html 转载请保留说明!

上一篇:微信小程序之开发遇到 does not have a method “xxxx“ to handle event “tap“ 问题的解决方案【已解决】(微信小程序开挂方法)

下一篇:Nvidia Jetson TX2入门指南(白话版)(jetson nano nvidia-smi)

  • 成都月饼包装免费设计_成都月饼包装设计公司_成都中秋节月饼包装设计(成都哪里有月饼盒批发)

    成都月饼包装免费设计_成都月饼包装设计公司_成都中秋节月饼包装设计(成都哪里有月饼盒批发)

  • 美团订单怎么取消订单(美团订单怎么取消退款申请)

    美团订单怎么取消订单(美团订单怎么取消退款申请)

  • QQ浏览器文件怎么编辑(qq浏览器文件怎么写字)

    QQ浏览器文件怎么编辑(qq浏览器文件怎么写字)

  • 双内存条和单内存条的区别(双内存条好还是单条好)

    双内存条和单内存条的区别(双内存条好还是单条好)

  • 什么是云空间,开通有啥用吗(什么是云空间不足怎么办)

    什么是云空间,开通有啥用吗(什么是云空间不足怎么办)

  • 转转卖家不发货怎么办(转转卖家不发货能收到钱吗)

    转转卖家不发货怎么办(转转卖家不发货能收到钱吗)

  • uhd610相当于什么显卡(uhd610多少钱)

    uhd610相当于什么显卡(uhd610多少钱)

  • 微信翻译对方能看到吗(你在微信翻译对话的时候对方能看到吗)

    微信翻译对方能看到吗(你在微信翻译对话的时候对方能看到吗)

  • 什么是拒绝服务攻击(什么是拒绝服务攻击,如何防范)

    什么是拒绝服务攻击(什么是拒绝服务攻击,如何防范)

  • 手机解压出错了是什么原因(手机解压文件时显示解压出错了怎么办)

    手机解压出错了是什么原因(手机解压文件时显示解压出错了怎么办)

  • Reno Ace的SOS紧急联络怎么用(设置sos紧急)

    Reno Ace的SOS紧急联络怎么用(设置sos紧急)

  • 无线充电器伤手机吗(无线充电 损伤)

    无线充电器伤手机吗(无线充电 损伤)

  • oppoa83忘记解锁密码怎么办(oppoa83手机忘记锁屏密码怎么办视频)

    oppoa83忘记解锁密码怎么办(oppoa83手机忘记锁屏密码怎么办视频)

  • 手机反向充电什么原理(手机反向充电什么用)

    手机反向充电什么原理(手机反向充电什么用)

  • 抖音怎么飘屏文字(抖音怎么才能飘屏打字)

    抖音怎么飘屏文字(抖音怎么才能飘屏打字)

  • 苹果为什么下载不了小红书(苹果为什么下载的软件不在桌面上显示)

    苹果为什么下载不了小红书(苹果为什么下载的软件不在桌面上显示)

  • 华为移动服务能不能卸载(华为移动服务能否卸载)

    华为移动服务能不能卸载(华为移动服务能否卸载)

  • ppt基本维恩图在哪个位置(word基本维恩图)

    ppt基本维恩图在哪个位置(word基本维恩图)

  • 极米h2怎么调节屏幕大小(极米h2怎么调节清晰度)

    极米h2怎么调节屏幕大小(极米h2怎么调节清晰度)

  • 微信怎么设置动态视频(微信怎么设置动态昵称)

    微信怎么设置动态视频(微信怎么设置动态昵称)

  • 预防木马的注意事项有哪些(预防木马的注意事项有)

    预防木马的注意事项有哪些(预防木马的注意事项有)

  • qq拔河在哪(qq的拔河彩蛋是真人连线吗)

    qq拔河在哪(qq的拔河彩蛋是真人连线吗)

  • 安卓手机怎么复制通讯录(安卓手机怎么复制电话号码到卡上)

    安卓手机怎么复制通讯录(安卓手机怎么复制电话号码到卡上)

  •  苹果全球联保吗(苹果全球联保什么意思)

    苹果全球联保吗(苹果全球联保什么意思)

  • Linux中网络管理命令ipconfig与route的基本使用教程(linux网络管理实训总结)

    Linux中网络管理命令ipconfig与route的基本使用教程(linux网络管理实训总结)

  • OpenGL 曝光度调节(opengl环境光参数)

    OpenGL 曝光度调节(opengl环境光参数)

  • 首付款计提税金吗
  • 280元抵减税控设备
  • 增值税发票管理办法及细则
  • 房产税从价计征如何算
  • 农产进项税是多少税率
  • 收到发票未付款怎么处理
  • 预收账款怎样清零
  • 长期投资计提减值准则
  • 企业股东投资
  • 城镇土地使用税纳税义务发生时间
  • 收到购货单位货款属于什么会计科目
  • 增值税开票资料没有电话可以吗
  • 有限合伙企业需要承担无限连带责任吗
  • 公司为员工交的五险一金到底是怎么回事
  • 合同税率16%调整到13%怎么算
  • 评估资产没有发票和流水怎么办
  • 产品的销售收入减去全部生产成本叫
  • 什么叫交易类型
  • 职工福利费算职工薪酬吗
  • 未计提的上一年企业所得税
  • 选择简易征收
  • 银行多收的开户费怎么办
  • 仓储费计入存货成本吗
  • PHP:pg_field_prtlen()的用法_PostgreSQL函数
  • wordpress怎么搜索域名
  • html文档怎么写
  • 财务比率分析的主要内容
  • 增值税即征即退操作流程
  • yii2 resetful 授权验证详解
  • 政府会计制度收入支出表
  • vue.js.
  • mla指令
  • 公允价值怎么记账
  • vscode开发gui
  • 支付员工工伤医疗费用怎么做账
  • 怎么样去掉
  • 社保年度申报错误可以调整吗
  • 固定资产盘盈为何要交所得税
  • 股东权益合计等于净资产吗
  • 母公司和子公司是什么关系
  • 企业分期收款销售商品,即商品已经交付
  • 委托加工环节应税消费品应纳税额的计算
  • 实收资本账务处理流程
  • 企业每月利润多少合适
  • 销售返利的账务处理案例
  • 建筑工程社会实践报告
  • 固定资产出售的收入属于收入吗
  • 预存话费发票能报销吗
  • 收到水电费发票要交印花税吗
  • 快递费专票可以报销吗
  • 运输费增值税专用发票
  • 科目汇总表里的应交税费
  • 事业单位私车公用如何处罚
  • mysql几天能学会
  • innodb_flush_method取值方法(实例讲解)
  • WINDOWS系统中删除放入回收站的文件占用什么空间
  • 进入pe系统后c盘变成了e盘
  • u盘和移动硬盘和固态硬盘的区别
  • windows8远程桌面连接
  • win7系统怎么设置微信多开
  • windows10 upnp
  • xp系统如何查看系统配置
  • ubuntu下载安装QQ的命令
  • 个性化定制方案怎么写
  • media.codec是什么
  • win10系统无法开机
  • perl中use strict
  • js数组菜鸟教程
  • linux u+s
  • bat批处理视频教程
  • chrome heat
  • linux小技巧
  • 详解JavaScript ES6中的Generator
  • jquery显示图片
  • python 很简单
  • js的eval函数
  • 在css中
  • 云南省国家税务局
  • 成都水费查询系统
  • 如何查询车辆购置税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设