Skip to content

实现一个极简的数据响应式

题目描述

js
// 有一个全局变量 a,有一个全局函数 b,实现一个方法bindData,执行后,a中任何属性值修改都会触发b的执行。
const a = {
  b: 1
};
function b() {
  console.log("a的值发生改变");
}
bindData();
// 此时输出 a的值发生改变
a.b = 2; 

console.log(a.b);
// 有一个全局变量 a,有一个全局函数 b,实现一个方法bindData,执行后,a中任何属性值修改都会触发b的执行。
const a = {
  b: 1
};
function b() {
  console.log("a的值发生改变");
}
bindData();
// 此时输出 a的值发生改变
a.b = 2; 

console.log(a.b);

代码

js
function bindData() {
  Object.keys(a).map(key => {
    let v = a[key];
    Object.defineProperty(a, key, {
      get() {
        console.log('你正在读取a里面的值');
        return v;
      },
      set(newA) {
        v = newA;
        b();
      }
    });
  });
}
function bindData() {
  Object.keys(a).map(key => {
    let v = a[key];
    Object.defineProperty(a, key, {
      get() {
        console.log('你正在读取a里面的值');
        return v;
      },
      set(newA) {
        v = newA;
        b();
      }
    });
  });
}

思考

其实从这个题目,你应该也能知道,Vue2中为什么你在data或者props中没有声明一个key的时候, 即使data或者props发生了变化,vue也不会更新。