位置: IT常识 - 正文

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

发布时间:2024-01-08
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)

  • 网页无法访问(网页无法访问如何解决手机)

    网页无法访问(网页无法访问如何解决手机)

  • b-f0电池是什么手机(b-f0电池是什么手机vivo)

    b-f0电池是什么手机(b-f0电池是什么手机vivo)

  • 打印机无法打印横向(打印机无法打印pdf文件)

    打印机无法打印横向(打印机无法打印pdf文件)

  • 京东自营与京东超市的区别(京东自营与京东自营官方旗舰店的区别)

    京东自营与京东超市的区别(京东自营与京东自营官方旗舰店的区别)

  • 什么是u-key(什么是ukey版网上银行)

    什么是u-key(什么是ukey版网上银行)

  • 手机卡突然失效的原因(手机卡突然失效了去移动公司可以补卡不)

    手机卡突然失效的原因(手机卡突然失效了去移动公司可以补卡不)

  • 钉钉如何两个群同时视频会议(钉钉如何两个群一块直播)

    钉钉如何两个群同时视频会议(钉钉如何两个群一块直播)

  • 抖音账号被永久封怎么办(抖音账号被永久禁言能解除吗)

    抖音账号被永久封怎么办(抖音账号被永久禁言能解除吗)

  • 平板电脑充电显示不在充电怎么回事(平板电脑充电显示黄色)

    平板电脑充电显示不在充电怎么回事(平板电脑充电显示黄色)

  • 苹果无服务怎么解决(苹果无服务怎么隐藏)

    苹果无服务怎么解决(苹果无服务怎么隐藏)

  • 锂电池的寿命有几年(锂电池的寿命有多少年)

    锂电池的寿命有几年(锂电池的寿命有多少年)

  • 天猫精灵要一直通电吗(天猫精灵要一直连着蓝牙吗)

    天猫精灵要一直通电吗(天猫精灵要一直连着蓝牙吗)

  • 电话技术支持有什么用(电话技术支持有效期和购买时期不对)

    电话技术支持有什么用(电话技术支持有效期和购买时期不对)

  • 华为p30自带的手机膜是什么膜(华为p30自带的手机膜可以揭掉吗?)

    华为p30自带的手机膜是什么膜(华为p30自带的手机膜可以揭掉吗?)

  • 淘宝会员名怎么复制(淘宝会员名怎么隐藏或屏蔽)

    淘宝会员名怎么复制(淘宝会员名怎么隐藏或屏蔽)

  • iqoopro怎么设置抬手亮屏(iqoopro怎么设置网络)

    iqoopro怎么设置抬手亮屏(iqoopro怎么设置网络)

  • 爱奇艺的打卡积分在哪里(爱奇艺的打卡积分怎么算)

    爱奇艺的打卡积分在哪里(爱奇艺的打卡积分怎么算)

  • 天猫u先是什么(天猫u先)

    天猫u先是什么(天猫u先)

  • 酷狗注销了怎么恢复(酷狗注销了怎么重新注册)

    酷狗注销了怎么恢复(酷狗注销了怎么重新注册)

  • 拼多多怎么开夜间模式吗(拼多多怎么开夜视)

    拼多多怎么开夜间模式吗(拼多多怎么开夜视)

  • 三星sm9650是什么版本

    三星sm9650是什么版本

  • 怎么建设一个电影网站(怎么建设一个电子邮箱)

    怎么建设一个电影网站(怎么建设一个电子邮箱)

  • 苹果11售价多少(苹果11售价多少人民币)

    苹果11售价多少(苹果11售价多少人民币)

  • 华为p30pro左上角HD什么意思(华为p30pro左上角返回键不灵敏怎么恢复)

    华为p30pro左上角HD什么意思(华为p30pro左上角返回键不灵敏怎么恢复)

  • react是什么框架(react框架有哪些)

    react是什么框架(react框架有哪些)

  • oppor17多长厘米(oppor17长宽多少)

    oppor17多长厘米(oppor17长宽多少)

  • 新华三路由器怎么设置(新华三路由器怎么登录)

    新华三路由器怎么设置(新华三路由器怎么登录)

  • 小米8怎样开4个微信(小米8怎样开4个小窗口)

    小米8怎样开4个微信(小米8怎样开4个小窗口)

  • cad改线宽没反应(cad2016改线宽没反应)

    cad改线宽没反应(cad2016改线宽没反应)

  • 系统限制无法忘记网络(系统限制无法安装什么原因)

    系统限制无法忘记网络(系统限制无法安装什么原因)

  • win10闹钟如何休眠仍然响(win10闹钟设置方法)

    win10闹钟如何休眠仍然响(win10闹钟设置方法)

  • 山东项目系统慢问题分析和解决(山东省项目)

    山东项目系统慢问题分析和解决(山东省项目)

  • 增值税纳税义务早于会计准则的案例
  • 什么是税务代理人
  • 超率累进税率有哪些税种呢怎么算
  • 物流公司车子保险费怎么做账
  • 金税盘怎样查询已开发票明细
  • 应交增值税和应交税费
  • 打印社保缴费凭证需要什么证件
  • 小规模人力资源外包税率
  • 销售金银首饰消费税怎么算
  • 政策性搬迁损失赔偿标准
  • 刚开始建账银行有存款怎么录
  • 个人承包集体企业历史
  • 到账的钱还能退回去吗
  • 金蝶标准版结转损益发生错误
  • 营改增土地增值税的计算
  • 汇总缴纳增值税附加税如何缴纳
  • 317房地产政策解读
  • 职工教育法
  • 发生的费用可以直接计入主营业务成本吗
  • 申报表利润总额与财务报表利润总额
  • 1697508019
  • 税率征收率的区别
  • 非现金资产包括
  • 确认无法回收的应收账款会计分录
  • 免征附加税费
  • mac打不开网页但是可以上微信
  • 进口缴纳的关税通过什么核算
  • 专用发票红字发票
  • macos monterey怎么降级
  • 筹建期间费用如何记账
  • 房地产会计核算地上地下成本分摊
  • 总额法的会计分录
  • Yii2如何批量添加数据
  • 加计抵减是适用什么税率
  • vue3中使用for循环引用多个组件
  • 股权收购印花税填哪里
  • uniapp中使用amap-vue,设置安全密钥
  • 图像的分类方法及具体的分类
  • custom用法
  • 财务公司可以开立一般账户吗
  • 企业发生销售退回时,不论销售退回的商品
  • 承兑汇票大回头是啥意思
  • PostgreSQL教程(十三):数据库管理详解
  • 政府补助收入的现金流属于什么
  • 差旅费报销原因
  • 复利和年金的区别通俗易懂的
  • 个人生产经营所得
  • 收到现金货款怎么处理
  • 营业利润率高好还是低好
  • 在租赁的土地上建房做固定资产吗
  • 支付商业承兑汇票怎么做
  • 道路交通事故中施救费应如何处理?
  • 过程中必须有哪两种状态
  • 增值税普通发票可以跨区域开吗
  • 接手前往年的银行余额不平怎么办?
  • 生产成本比主营业务成本大
  • 应收账款属于流动负债项目吗
  • mysql常用命令
  • mysql数据库增加列
  • mysql数据库-数据库和表的基本操作
  • Windows Server 2003下DHCP服务器的安装与简单配置图文教程
  • linux中安装vim命令
  • 如何设置windows启动密码
  • win7系统鼠标右键无法弹出菜单
  • cpqa1000.exe是安全进程吗 cpqa1000进程有什么作用
  • 中国有多少台百万机组
  • 文件夹删不掉显示另一个程序打开
  • 如何找回windows删除的文件
  • nodejs web3
  • 简单的jquery插件实例
  • unity3d跨平台
  • android 调用相机拍照
  • python爬虫模拟登录亚马逊
  • logcatapp
  • jquery.flot
  • android通信机制
  • 3000劳务报酬如何缴税
  • 党建引领安全宣传美篇幼儿园
  • 12123怎么上传交强险
  • 加拿大海关关税税率查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号