手写 vue3 的 ref,reactive 和 watchEffect

简介: 手写 vue3 的 ref,reactive 和 watchEffect
// 存储副作用函数的集合,类似数组,但无序,比数组性能更好
const fns = new Set();

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      // 取值时,若发现副作用函数,则添加到副作用函数集合
      if (activeFn) fns.add(activeFn);

      const val = target[key];
      if (typeof val === "object" && val != null) {
        // 若obj的属性值是对象,则递归 (此处仅考虑了属性值是对象的情况)
        return reactive(val);
      } else {
        return val;
      }
    },
    set(target, key, newVal) {
      target[key] = newVal;
      // 更新值时,遍历执行一次所有副作用函数
      fns.forEach((fn) => fn());
      return true;
    },
  });
}

// ref 的本质,就是属性为 value 的对象的 reactive
function ref(value) {
  return reactive({ value: value });
}

let activeFn;
function watchEffect(fn) {
  activeFn = fn;
  // 在创建时,即执行第一次回调
  fn();
}

测试

const user = reactive({ name: "朝阳" });
watchEffect(() => {
  console.log("name", user.name);
});
user.name = "张三";
setTimeout(() => {
  user.name = "李四";
}, 1000);
目录
相关文章
|
4天前
|
JavaScript 索引
Vue 2和Vue 3的区别以及实现原理
Vue 2 的响应式系统通过Object.defineProperty来实现,它为对象的每个属性添加 getter 和 setter,以便追踪依赖并响应数据变化。
20 9
|
4天前
|
JavaScript 调度
Vue3 使用 Event Bus
Vue3 使用 Event Bus
10 1
|
4天前
|
JavaScript
Vue3 : ref 与 reactive
Vue3 : ref 与 reactive
9 1
|
4天前
Vue3 使用mapState
Vue3 使用mapState
9 0
|
JavaScript 前端开发 API
Vue3入门到精通--ref以及ref相关函数
Vue3入门到精通--ref以及ref相关函数
|
8天前
|
JavaScript
vue学习(3)模板语法
vue学习(3)模板语法
40 11
|
8天前
|
存储 JavaScript 前端开发
vue学习(2)
vue学习(2)
197 65
|
7天前
|
JavaScript
vue学习(4)数据绑定
vue学习(4)数据绑定
24 10
|
7天前
|
JavaScript 前端开发
vue学习(6)
vue学习(6)
25 9
|
7天前
|
JavaScript 开发者
vue学习(5)
vue学习(5)
22 7