【前端】vue数据监测原理

问题展示:

点击按钮之后,vue中的persons数据改变,但是页面显示的内容没变。(先点击按钮再打开vue的数据面板可以看见改变,先打开后点击数据面板也不能显示改变。)

此时的更新代码:

javascript 复制代码
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。

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

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

javascript 复制代码
//创建一个监视的实例对象,用于监视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中的对象或者数组增加值。

javascript 复制代码
//给对象加
Vue.set(vm.student,'sex','男');

//给数组修改
Vue.set(vm.student.hobby,0,'打台球');

到这可以解释为什么直接修改数组中的值不奏效,因为数组没有给它设置get和set方法。

那数组怎么修改。vue只承认js数组方法中更改原数据的方法对数组进行修改。用他们更改可以奏效,vue对他们进行了重写、包装。

相关推荐
甲枫叶2 分钟前
【claude产品经理系列13】核心功能实现——需求的增删改查全流程
java·前端·人工智能·python·产品经理·ai编程
蓝帆傲亦20 分钟前
Vue.js 大数据处理全景解析:从加载策略到渲染优化的完全手册
前端·vue.js·flutter
不会敲代码121 分钟前
React组件通信实战:从Todo应用彻底搞懂父子、子父、兄弟通信
前端·react.js
SuperEugene21 分钟前
字符串处理实战:模板字符串、split/join、正则的 80% 用法
前端·javascript·面试
wuhen_n22 分钟前
前端构建工具:从Rollup到Vite
前端
钟智强22 分钟前
深度剖析CVE-2023-41064与CVE-2023-4863:libwebp堆溢出漏洞的技术解剖与PoC构建实录
前端·后端
钟智强22 分钟前
MySQL客户端惊现高危漏洞CVE-2023-21980,可导致远程代码执行
前端·后端
Cache技术分享24 分钟前
332. Java Stream API - Java Stream 实战进阶:按年份找出合作最多的作者对
前端·后端
SuperEugene24 分钟前
前端正则表达式完全指南:从手写不出到随手就来
前端·正则表达式
Highcharts.js25 分钟前
图表学习|基于highcharts创建子弹图表,以及子弹图的应用与扩展设计
javascript·信息可视化·highcharts·图表开发·子弹图表·kpi图