Kasan Blog

vue响应式原理

Object.defineProperty 有 get 和 set 方法

set 方法允许在对象外直接添加一个属性而不需要到本体对象里添加

而且可以在 set 方法里添加条件判断和自定义事件

使用vue的数据响应式时,vue会使用set方法在外部添加数据,数据添加完成后,通知页面渲染此数据,就完成了数据的响应

const div = document.querySelector('.test')

function p1(x){// p1 其实只执行了一次,下面这行打印也只执行一次
    console.log(x) // {n:200}
    let value = x.n //记录原始的值为value,这一行纯属为了在初始化后,在未set值的时候,能直接使用x.n的值
    Object.defineProperty(x,'n',{  //
        get(){
            return value 
        },
        set(newVal){
            if(newVal<0){
            value = newVal
            div.innerHTML = data5.n // 数据更新后通知视图更新新数据,实现数据响应
            }else(console.log('赋值不能小于0'))
        },
    })
    return x
}
let data5 = {n:200}
let data = p1(data5)
 data.n = -122 //成功

 data.n = 1 //'赋值不能小于0'

 data5.n = 1000  //篡改失败,无论是修改data.n还data5.n 都要通过set 的条件判断,不能绕过 set 的判断篡改数据



setInterval(() => {
    data.n = -Math.floor(Math.random()*(1000-50))-50
    console.log( data.n )
}, 550);