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

  • 小米10s可以用电信移动卡(小米1s电信版能用移动卡吗)(小米10s可以用电信卡吗)

    小米10s可以用电信移动卡(小米1s电信版能用移动卡吗)(小米10s可以用电信卡吗)

  • 华为5gmate30pro手机多重(华为手机-mate30pro 5g)

    华为5gmate30pro手机多重(华为手机-mate30pro 5g)

  • 照片文件名怎么修改(照片文件名怎么弄)

    照片文件名怎么修改(照片文件名怎么弄)

  • 华为畅连通话怎么设置(华为畅连通话怎么设置铃声)

    华为畅连通话怎么设置(华为畅连通话怎么设置铃声)

  • 魅族17和17pro有什么区别(魅族17和17pro哪个更值得购买)

    魅族17和17pro有什么区别(魅族17和17pro哪个更值得购买)

  • 小红书改不了头像怎么回事(小红书最近不能改头像)

    小红书改不了头像怎么回事(小红书最近不能改头像)

  • 什么是文件夹(简述什么是文件夹)

    什么是文件夹(简述什么是文件夹)

  • 文件打印出来内容是半页怎么办(文件打印出来内容不全可以补打一次吗)

    文件打印出来内容是半页怎么办(文件打印出来内容不全可以补打一次吗)

  • 苹果手机进水声音变沙哑变小(苹果手机进水声音没有了怎么办)

    苹果手机进水声音变沙哑变小(苹果手机进水声音没有了怎么办)

  • 抖音视频时长规则(抖音视频时长控制多少好?)

    抖音视频时长规则(抖音视频时长控制多少好?)

  • windows7旗舰版支持的功能是最多的吗(Windows7旗舰版支持蓝牙吗?)

    windows7旗舰版支持的功能是最多的吗(Windows7旗舰版支持蓝牙吗?)

  • 如果自己的手机号被别人绑定了怎么办(如果自己的手机号忘了怎么办)

    如果自己的手机号被别人绑定了怎么办(如果自己的手机号忘了怎么办)

  • 用户名格式不正确是什么意思(用户名格式不正确是什么意思12306)

    用户名格式不正确是什么意思(用户名格式不正确是什么意思12306)

  • 美版无锁和国行的区别(美版无锁和国行信号一样吗)

    美版无锁和国行的区别(美版无锁和国行信号一样吗)

  • 苹果手机充电一宿可以吗(苹果手机充电一闪一闪的充不进去电)

    苹果手机充电一宿可以吗(苹果手机充电一闪一闪的充不进去电)

  • 显示器显示图像的清晰度主要取决于(显示器显示图像设定,屏幕优化)

    显示器显示图像的清晰度主要取决于(显示器显示图像设定,屏幕优化)

  • iphone录视频怎么暂停(iphone录视频怎么关闭声音)

    iphone录视频怎么暂停(iphone录视频怎么关闭声音)

  • 微信可以注册几个公众号(微信可以注册几个王者号)

    微信可以注册几个公众号(微信可以注册几个王者号)

  • ipad死机了怎么重启(ipad死机咋办)

    ipad死机了怎么重启(ipad死机咋办)

  • xs前置摄像头像素(xs前置摄像头模糊怎么办)

    xs前置摄像头像素(xs前置摄像头模糊怎么办)

  • 为什么抖音打不开显示网络连接错误(为什么抖音打不了视频电话)

    为什么抖音打不开显示网络连接错误(为什么抖音打不了视频电话)

  • 手机桌面图标不见了怎么恢复(手机桌面图标不显示文字了怎么回事)

    手机桌面图标不见了怎么恢复(手机桌面图标不显示文字了怎么回事)

  • 荣耀9x是typec吗

    荣耀9x是typec吗

  • 如何恢复取消的公众号(如何恢复取消的蓝牙设备)

    如何恢复取消的公众号(如何恢复取消的蓝牙设备)

  • 与下段同页如何设置(与下段同页有什么用)

    与下段同页如何设置(与下段同页有什么用)

  • 系统托盘无法隐藏图标(系统托盘无法隐藏文件夹)

    系统托盘无法隐藏图标(系统托盘无法隐藏文件夹)

  • MAC如何保存土豆网的视频找不到下载链接(macbook怎么保存)

    MAC如何保存土豆网的视频找不到下载链接(macbook怎么保存)

  • shadowbar.exe - shadowbar是什么进程 有何作用

    shadowbar.exe - shadowbar是什么进程 有何作用

  • css动画效果(css动画效果代码)

    css动画效果(css动画效果代码)

  • java事件处理机制的组件(java事件处理机制三个重要概念)

    java事件处理机制的组件(java事件处理机制三个重要概念)

  • 一般纳税人季报怎么申报
  • 小规模纳税人的认定标准是什么
  • 白酒消费税税率多少钱一吨
  • 税负率的计算方法有哪些
  • 电商账务处理及收入成本如何确定?
  • 无形资产的税费计入
  • 企业合并吸收税务处理
  • 会计凭证包括哪三种
  • 分公司亏损总公司怎么办
  • 法人分配利润分录
  • 免税项目怎么做账
  • 补发工资如何计提
  • 外购原材料自用
  • 出借包装物一次摊销金额计算
  • 融资贷款保险费计算公式
  • 分公司所得税怎么交
  • 增值税专用发票验票
  • 成本费用包括哪些包括外购材料吗
  • 个人销售比例用什么函数
  • 金融企业的成本核算方法
  • 将捐赠收入计入资本公积转增增值税
  • bios中关闭软盘
  • mac 的系统
  • 存货计划成本法好处
  • 企业所得税清算报备是什么意思
  • 电脑右下角总是弹出广告
  • 任务管理器无法完成操作拒绝访问
  • 苹果电脑付款方式设置
  • 赠送积分有两种形式
  • 投资性房地产出售
  • php变量用什么符号
  • php readfile
  • 新会计准则里的现金流量的公式
  • 今日元宵节图片
  • php出现错误代码怎么办
  • 委托加工业务要交税吗
  • 个人转让土地使用权可以开专票吗
  • vue用法
  • vue3setup语法糖如何定义realtive数据
  • 业务招待费会计和税法差异
  • 请求转发与重定义的区别
  • 旅行社差额纳税的规定
  • /etc/rc.local添加内容
  • 建筑业总包增值税
  • 报废车怎么上路
  • 企业残保金计提分录
  • 账簿包括哪些基本内容
  • 职工工资加计扣除
  • 住宿费发票可以报销吗
  • 拆迁补偿怎么算的
  • 给客户的回扣怎么表达
  • 用友软件冲销之前凭证怎么操作
  • 出库单上面的价格是什么价格
  • 申报和做账必须一致吗
  • 公司房租没有发票不入账税务怎么处理
  • 哪个行业的会计最难
  • 明细分类账表格
  • mysql 临时表
  • 回顾30年的水文模型参数率定研究
  • 解决口苦最快的方法
  • debian系列
  • 系统用户在哪里
  • fsc文件用什么软件打开
  • windows8.1的设置在哪
  • win101909的02累积更新
  • jquery showdialog
  • 深入理解
  • 用android做一个简单的软件
  • linux awk $1
  • list在python中的作用
  • android broadcast
  • shell脚本wc
  • js的eval函数
  • bootstrap快速入门
  • 设计服务税收分类编码
  • 什么叫关联单位
  • 1.8排量够用吗
  • 车辆购置税纳税申报表下载
  • 如何代扣个人所得税
  • 为什么消费税是价内税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设