【前端】vue数据监测原理

问题展示:

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

此时的更新代码:

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

没有问题的更新代码:

methods:{

//没问题的更新代码

updateMei:function(){

this.persons0.name = "马保国" ;

this.persons0.age = 50;

this.persons0.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对他们进行了重写、包装。

相关推荐
To_OC18 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC18 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic18 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy18 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志19 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble20 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长20 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯21 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜21 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司1 天前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能