手写 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);
目录
相关文章
|
3天前
【vue3】Argumnt of type ‘history:RouterHistory;}is not assignable to paraeter of type ‘RouterOptions‘.
【vue3】Argumnt of type ‘history:RouterHistory;}is not assignable to paraeter of type ‘RouterOptions‘.
6 0
|
3天前
|
JavaScript
【vue3】vue3中路由hash与History的设置
【vue3】vue3中路由hash与History的设置
8 0
|
3天前
|
编解码 前端开发
【Vue3】解决电脑分辨率125%、150%及缩放导致页面变形的问题
【Vue3】解决电脑分辨率125%、150%及缩放导致页面变形的问题
11 0
|
4天前
|
JavaScript
【vue】 vue 翻页时钟制作,vue2、vue3
【vue】 vue 翻页时钟制作,vue2、vue3
11 0
|
JSON 前端开发 API
Vue3入门到精通--reactive以及reactive相关函数
Vue3入门到精通--reactive以及reactive相关函数
|
2天前
|
JavaScript
|
4天前
|
JavaScript
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
【vue】el-dialog 内的tinymce弹窗被遮挡的解决办法 及 tinymce打开弹出菜单后直接关闭对话组件,导致该弹出菜单残留
14 6
|
1天前
|
存储 缓存 JavaScript
vue代码优化方案
【7月更文挑战第13天】 **Vue.js 优化要点:** 分解大组件以提高复用性和加载速度;利用计算属性与侦听器优化数据处理;使用Object.freeze()减少响应式数据;借助Vuex或Composition API管理状态;实现虚拟滚动和无限加载提升长列表性能;路由懒加载减少初始加载时间;用Vue DevTools检测性能瓶颈;定期代码审查与重构;应用缓存策略;遵循最佳实践与团队规范,提升应用整体质量。
10 2
|
3天前
|
JavaScript 前端开发
【vue】 el-table解决分页不能筛选全部数据的问题
【vue】 el-table解决分页不能筛选全部数据的问题
15 4
|
3天前
|
JavaScript
【vue】 vue2 监听滚动条滚动事件
【vue】 vue2 监听滚动条滚动事件
10 1