vue处理响应式的思路

首先看如下js代码
let a = '张三'
console.log(a) // 当前页面展示的是张三 a = '李四'

首先页面刚开始渲染的时候数据a为张三,之后将a修改为了李四以后页面不会发生改变,但是数据已经修改了,vue为了解决这一问题,采用响应式的办法。

通过对象的defineProperty方法,在回调函数中监听;

Object.defineProperty(obj, key, {
      get: function () {
        //  依赖收集,记录:是哪个函数在用我return internalValue;
      },
      set: function (val) {
        internalValue = val;
        // 派发更新,运行:执行用我的函数
      },
    });

要考虑到当然不是只给一个固定的函数使用,所以会涉及到自动读取需要进行响应的对象,并通过数组对其进行保存,最后通过set函数进行派发更新

function observe(obj) {
  for (const key in obj) {
    let internalValue = obj[key];
    let funcs = [];
    Object.defineProperty(obj, key, {
      get: function () {
        //  依赖收集,记录:是哪个函数在用我
        if (window.__func && !funcs.includes(window.__func)) {
          funcs.push(window.__func);
        }
        return internalValue;
      },
      set: function (val) {
        internalValue = val;
        // 派发更新,运行:执行用我的函数
        for (var i = 0; i < funcs.length; i++) {
          funcs[i]();
        }
      },
    });
  }
}

function autorun(fn) {
  window.__func = fn;
  fn();
  window.__func = null;
}

 

posted @ 2023-09-30 12:59  _曾经沧海难为水  阅读(12)  评论(0编辑  收藏  举报