位置: 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)

  • bkktl00华为是什么型号

    bkktl00华为是什么型号

  • vivo是什么系统的手机

    vivo是什么系统的手机

  • 华为band3e手环怎么用(华为band3e手环怎么调节亮度)

    华为band3e手环怎么用(华为band3e手环怎么调节亮度)

  • 荣耀x10升降摄像头怎么打开(荣耀X10升降摄像头尴尬不)

    荣耀x10升降摄像头怎么打开(荣耀X10升降摄像头尴尬不)

  • 无internet访问是什么意思(无internet访问什么原因)

    无internet访问是什么意思(无internet访问什么原因)

  • 转语音信箱是拒接吗(转接语音信箱)

    转语音信箱是拒接吗(转接语音信箱)

  • 苹果11三款屏幕尺寸(iphone 11什么屏幕)

    苹果11三款屏幕尺寸(iphone 11什么屏幕)

  • 淘宝黑金会员是什么意思(淘宝黑金卡是什么卡)

    淘宝黑金会员是什么意思(淘宝黑金卡是什么卡)

  • 主机耳机孔在哪个位置(主机上面的耳机孔怎么不能用)

    主机耳机孔在哪个位置(主机上面的耳机孔怎么不能用)

  • 淘气值799还能涨吗(淘气值从799开始下降是什么情况)

    淘气值799还能涨吗(淘气值从799开始下降是什么情况)

  • flash源文件和影片文件的扩展名分别为(flash源文件和影片扩展名分别为)

    flash源文件和影片文件的扩展名分别为(flash源文件和影片扩展名分别为)

  • 华为桌面上的时间和天气不见了咋办(华为桌面上的时间和天气删掉了怎样恢复)

    华为桌面上的时间和天气不见了咋办(华为桌面上的时间和天气删掉了怎样恢复)

  • ip地址采用多少个字节(ip地址多少位)

    ip地址采用多少个字节(ip地址多少位)

  • 怎样设置软件密码锁(怎样设置软件密码锁 oppo)

    怎样设置软件密码锁(怎样设置软件密码锁 oppo)

  • 虎牙消费金额怎么查询(虎牙消费的钱能要回来吗)

    虎牙消费金额怎么查询(虎牙消费的钱能要回来吗)

  • 移动硬盘能连接手机吗(移动硬盘能连接笔记本电脑吗)

    移动硬盘能连接手机吗(移动硬盘能连接笔记本电脑吗)

  • facetime不可用的原因(facetime为什么不可用)

    facetime不可用的原因(facetime为什么不可用)

  • 爱奇艺字幕设置在哪里(爱奇艺字幕设置在哪里电脑)

    爱奇艺字幕设置在哪里(爱奇艺字幕设置在哪里电脑)

  • 苹果手机怎么开启定位(苹果手机怎么开空调万能遥控器)

    苹果手机怎么开启定位(苹果手机怎么开空调万能遥控器)

  • cad捕捉设置快捷键(cad2012捕捉设置快捷键)

    cad捕捉设置快捷键(cad2012捕捉设置快捷键)

  • 网易绑定手机号码解除(网易绑定手机号怎么解除绑定)

    网易绑定手机号码解除(网易绑定手机号怎么解除绑定)

  • 通过邮件远程控制Mac进入睡眠状态(无需任何软件)(邮件远程控制)

    通过邮件远程控制Mac进入睡眠状态(无需任何软件)(邮件远程控制)

  • 如何检查路由器是否被人蹭网(如何检查路由器防火墙设置)

    如何检查路由器是否被人蹭网(如何检查路由器防火墙设置)

  • python中with语句的作用(python中with语句的用法)

    python中with语句的作用(python中with语句的用法)

  • 纳税申报的具体要求
  • 应纳税所得额是利润总额吗
  • 应交税费是什么类
  • 房地产开发公司排名
  • 公司投资股票亏损,要交企业所得税和个人所得税吗
  • 更正申报多交的个税
  • 调整多计提所得税的分录
  • 短期薪酬是会计科目么
  • 逾期支付工程款利息计算
  • 非居民企业所得税计算公式
  • 产品在海关发生质量问题
  • 个人独资企业税率表2023最新
  • 无法收回的款项怎么记账
  • 房地产企业工程款支付流程
  • 代收电费可以开发票吗
  • 小规模无进项发票,需要开1%专票,税点是多少
  • 净利润亏损怎么结转
  • 写着个人的发票能下账吗
  • 接受无形资产投资进项税
  • 工程项目关闭
  • 企业销售食品过期处罚
  • 支付税点是什么意思
  • 为什么申报个人所得税还要补税
  • php汉字转拼音代码
  • 家装行业如何确认收入
  • php 字符串函数
  • 质量扣款入什么科目
  • 公司暂估成本是什么意思
  • 环形链表入口节点
  • linux子网掩码自动变成24
  • 解聘员工补偿金能拖欠吗
  • 最小的手机有多大
  • 房地产企业以房产对外投资需要交什么税
  • php操作oracle
  • 税务机关代小规模纳税人开发票
  • 个人所得税现金流量表属于哪一项
  • php image
  • 公司房租收据怎么写
  • pythonif嵌套语句
  • 机器学习——果蔬分类
  • 帝国cms8.0
  • 长期股权投资减值准备是什么科目
  • sqlserver表与表之间怎么关联
  • 个体工商户怎么年报
  • 注册资本在十年后怎么办
  • 存货在报表里是如何体现的
  • 企业按季度交税
  • 企业所得税季度申报数据怎么来
  • 农产品税率2020年计算
  • 志愿者服务活动有哪些内容
  • 预缴增值税需要提交什么资料
  • 收到的发票未抵税怎么办
  • 混凝土增值税发票税率
  • 客户试用产品期间怎么跟进
  • 公司做的形象墙效果图
  • 结转库存商品需要附件吗
  • 销售费用可以提现吗
  • 员工用自己的钱买的材料如何做账
  • 资产减值损失是借增贷减吗
  • 在sql server数据库中
  • mysql 授权命令
  • win10 mobile 预览10240
  • freebsd软件安装
  • docker untagged
  • drupdate
  • 电脑的本地连接在哪win10
  • ubuntu创建新用户并增加管理员权限
  • win7系统的桌面图标怎么调出来
  • linux网络设备有哪些
  • 如何禁用系统
  • linux常用命令详解
  • unity如何避免碰撞穿透
  • opengl metal
  • js 截取
  • python中的整数
  • ubuntu各种方法卸载软件
  • python中函数的功能及作用
  • 如何查询税控盘口令和密码
  • 重庆市网上审批服务大厅
  • 美国网购消费者个人信息保护法
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设