当前位置: 首页 > news >正文

【前端】vue数据监测原理

问题展示:
在这里插入图片描述
点击按钮之后,vue中的persons数据改变,但是页面显示的内容没变。(先点击按钮再打开vue的数据面板可以看见改变,先打开后点击数据面板也不能显示改变。)
在这里插入图片描述
此时的更新代码:

methods:{updateMei:function(){this.persons[0] = {id:'001',name:'马老师',age:50,sex:'男'}}
}

没有问题的更新代码:
methods:{
//没问题的更新代码
updateMei:function(){
this.persons[0].name = “马保国” ;
this.persons[0].age = 50;
this.persons[0].sex = “男”;

}

}
有可能进行的是深度检测,在对象结构没发生变化的时候。

Vue数据监视原理
监视挂载步骤:
1.加工data:期望可以达到响应式数据更新的效果。—给对象的每个属性加get和set。

//不行的版本
// Object.defineProperty(data,'name',{
//     get(){
//         return data.name;
//     },
//     set(val){
//         data.name = val;
//     }
// })

上述不可行的方案原因是因为data.name调用的也是get的方法,因此会一直递归。set中的data.name=val也是set的方法,也会一直递归。

//创建一个监视的实例对象,用于监视data中的属性的变化
const obs = new Observer(data);function Observer(obj){//汇总对象中的所有属性形成一个数组,获取所有的属性名const keys = Object.keys(obj);//遍历keys.forEach((k)=>{Object.defineProperty(this,k,{get(){return obj[k];},set(val){console.log(k+"改变了");obj[k] = val;}})})
}

上述可行是因为将get和set方法挂载在了obs对象上,只有调用obs.name去获取值以及设置值的时候才会使用get和set方法。如下图所示。
请添加图片描述
问题:为什么data改变的时候obs中的name也会变。
因为在obs对象中是引用了data的地址,并非自己创建了一个参数。跟c中一样。引用的是同一个对象。

在这里插入图片描述
2.vm._data = data = obs

Vue.set(target, key,val) / vm.$set(target, key,val)的使用
Api的作用:给vue对象data中的对象或者数组增加值。

//给对象加
Vue.set(vm.student,'sex','男’);//给数组修改
Vue.set(vm.student.hobby,0,’打台球’);

到这可以解释为什么直接修改数组中的值不奏效,因为数组没有给它设置get和set方法。
在这里插入图片描述
那数组怎么修改。vue只承认js数组方法中更改原数据的方法对数组进行修改。用他们更改可以奏效,vue对他们进行了重写、包装。
在这里插入图片描述


http://www.mrgr.cn/news/9220.html

相关文章:

  • Makefile简单使用
  • Matlab基本知识
  • 裸机:串口通信
  • git cherry-pick 合并多个提交
  • linux之网络子系统-tcpdump 原理
  • PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码
  • 背包问题(完全背包)
  • Java Web —— 第七天(Mybatis案例 部门管理)
  • EXCEL 分段排序--Excel难题#86
  • 不良贷款只有“贷款逾期”?你知道还有“呆滞”、“呆账”贷款吗?
  • 数学基础 -- 微积分之线性化
  • docker升级docker pull mysql:5.7.37异常
  • 【鼠鼠学AI代码合集#3】简单的数据操作 (pytorch)
  • BCEWithLogitsLoss
  • 大模型在应用开发安全左移实践
  • C#中的压缩与解压缩:掌握内置功能的艺术
  • Matlab自学笔记三十四:表table的排序、查找、提取、删除、计算、与结构数组的转换
  • CSS\JS实现页面背景气泡logo上浮效果
  • ubuntu20.04源码编译安装qemu(qemu8.2)
  • 01 BlockChain--