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

  • iqooz5x和平精英能开多少帧

    iqooz5x和平精英能开多少帧

  • windows10设备管理器在哪(windows10设备管理器找不到蓝牙)

    windows10设备管理器在哪(windows10设备管理器找不到蓝牙)

  • 华为红外线功能如何开启(华为红外线功能坏了)

    华为红外线功能如何开启(华为红外线功能坏了)

  • 华为荣耀v20和mate20对比(华为荣耀v20和magic2)

    华为荣耀v20和mate20对比(华为荣耀v20和magic2)

  • 苹果xrIOS13.5录屏声音小怎么调大(苹果xr屏幕录屏)

    苹果xrIOS13.5录屏声音小怎么调大(苹果xr屏幕录屏)

  • 和我信服务器连接失败(和我信登录)

    和我信服务器连接失败(和我信登录)

  • 镜像初始化错误连接断开什么原因(镜像初始化失败)

    镜像初始化错误连接断开什么原因(镜像初始化失败)

  • qq群课堂有回放吗(qq群课堂视频回放)

    qq群课堂有回放吗(qq群课堂视频回放)

  • 手机没电了怎么办vivo(手机没电了怎么幽默的说)

    手机没电了怎么办vivo(手机没电了怎么幽默的说)

  • 微信朋友圈只能看到共同好友的评论吗(微信朋友圈只能看几条 后来就一条线)

    微信朋友圈只能看到共同好友的评论吗(微信朋友圈只能看几条 后来就一条线)

  • 淘宝评论删除了可以重新再评吗?(淘宝评论删除了还可以评论吗)

    淘宝评论删除了可以重新再评吗?(淘宝评论删除了还可以评论吗)

  • 快手注销账号一般几天之内(快手注销账号一定会成功吗)

    快手注销账号一般几天之内(快手注销账号一定会成功吗)

  • 华为mate30pro防水级别(华为Mate30pro防水吗 掉水里了)

    华为mate30pro防水级别(华为Mate30pro防水吗 掉水里了)

  • 京东购物怎么取消订单(京东购物怎么取消白条支付)

    京东购物怎么取消订单(京东购物怎么取消白条支付)

  • 淘金币明细在哪里(淘金币使用记录)

    淘金币明细在哪里(淘金币使用记录)

  • 淘宝几颗星在哪看(淘宝几颗星在哪看手机)

    淘宝几颗星在哪看(淘宝几颗星在哪看手机)

  • 华为手机锁屏时间在哪里设置(华为手机锁屏时显示步数在哪里设置)

    华为手机锁屏时间在哪里设置(华为手机锁屏时显示步数在哪里设置)

  • 支付宝无感支付怎么用(支付宝无感支付哪些地方可以用)

    支付宝无感支付怎么用(支付宝无感支付哪些地方可以用)

  • word表格怎么求平均值(word表格怎么求和一行数据)

    word表格怎么求平均值(word表格怎么求和一行数据)

  • 拨号图标没了怎么恢复(拨号图标没了怎么找)

    拨号图标没了怎么恢复(拨号图标没了怎么找)

  • ps色阶快捷键(ps色阶快捷键是多少)

    ps色阶快捷键(ps色阶快捷键是多少)

  • 自己发的朋友圈删不掉(自己发的朋友圈怎么撤回)

    自己发的朋友圈删不掉(自己发的朋友圈怎么撤回)

  • 如果网页上有错误该如何解决呢?(如果网页上有错字怎么办)

    如果网页上有错误该如何解决呢?(如果网页上有错字怎么办)

  • php安装grpc扩展的方法(php7编译安装gd库)

    php安装grpc扩展的方法(php7编译安装gd库)

  • 企业所得税是什么意思大白话
  • 不能抵扣的增值税进项税额是什么
  • 固定资产大修理的标准
  • 失业稳岗补贴怎么记账
  • 划转税务的非税发票
  • 增值税减免所得税填在哪一栏
  • 劳务费发票是个人开还是公司开
  • 油卡预付款可以报销吗
  • 建筑公司核定征收所得税怎么算
  • 银行承兑汇票怎么填写
  • 个人所得税没有税也要申报吗
  • 报销个人费用如何定性
  • 小规模企业怎么报国税
  • 通讯费要计入应付账款吗
  • 地方附加税
  • 财务负责人和办税人员哪个责任大
  • 少数股东损益借方增加还是贷方增加
  • 票据转让后本公司还有责任吗
  • 企业汽油费会计分录
  • 制造行业库存该怎么处理
  • 研发样机转销售合法吗
  • 个体户没有进项票怎么开销项发票
  • 交割单会出错吗
  • 金银镶嵌首饰在哪个环节交消费税
  • 去年的成本发票怎么做账
  • php中实现文件上传的函数
  • 经营性支出属于哪个科目
  • 苹果发布macOS13.5开发者预览版
  • 企业的税收优惠政策有哪些
  • hpc程序
  • fs是什么文件
  • 绣球花的叶子出现了斑点,这是怎么了?
  • php的运算符主要包括哪些?
  • php知识总结
  • 建筑业异地施工可以先开发票么
  • 加利福尼亚湾在哪
  • 混凝土简易计税能抵扣么
  • uml中的顺序图由什么组成
  • 企业合并发生的交易费用
  • 股权收购印花税填哪里
  • mysqljoin查询
  • php实现四种基础方式
  • 处置固定资产涉税
  • mysql复制一条记录
  • 跨年租金如何确权
  • 公司被吊销营业执照的法律后果是什么?
  • 公司的个人所得税是什么意思
  • sql语句分组汇总
  • 什么情况下不能开税票
  • 会员代金券模板
  • 幼儿园账务处理实务
  • 未分配利润可以用于企业经营吗
  • 信用卡逾期滞纳金怎么收取
  • 装饰公司购买的安装服务怎么入账
  • 纳税人和负税人区别通俗易懂
  • 工业企业销售商品
  • mysql多表连接的方式
  • win7怎么把桌面图标显示出来
  • 电脑bios启动项设置中文
  • ubuntu创建新用户并增加管理员权限
  • 深度隐藏root
  • MAC OS X Yosemite开启深色模式的方法
  • tdxcef.exe进程
  • pruttct.exe - pruttct是什么进程 有什么用
  • hpadrv.sys
  • linux远程更新程序
  • win7玩不了cf
  • cocos jsc
  • android图片布局
  • python用于读取文本文件内容的方法
  • javascript产生随机整数随机性强
  • css图片渐变效果
  • 最简单的java设计
  • jquery.load()方法,刷新网页
  • 企业党支部怎么称呼
  • 税务催报通知书怎么接收
  • 国家税务总局令第52号 ,税务稽查案件办理程序规定
  • 四川社保缴费后多久生效
  • 综合所得税包括哪些内容
  • 舆论与舆情之间的关系是怎样的?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设