Vue3手写api之reactive、readonly、ref

Vue 3 中的响应式编程 API 主要包括 reactivereadonlyref。这些 API 允许你创建具有响应式行为的数据对象。下面是手写这些 API 的简单示例:

1.reactive:

reactive 函数接受一个普通的 JavaScript 对象,并返回一个具有响应式行为的代理对象。

javascript 复制代码
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      const value = Reflect.get(target, key, receiver);
      // 在这里可以处理依赖收集
      return value;
    },
    set(target, key, value, receiver) {
      const result = Reflect.set(target, key, value, receiver);
      // 在这里可以触发更新通知
      return result;
    },
    // 处理其他钩子如 deleteProperty 等
  });
}

const state = reactive({ count: 0 });

console.log(state.count); // 输出: 0
state.count = 1; // 触发更新

2.readonly:

readonly 函数接受一个对象,并返回一个只读的代理对象,防止被修改。

javascript 复制代码
function readonly(obj) {
  return new Proxy(obj, {
    set(target, key, value) {
      console.warn(`Cannot set ${key} on a readonly object.`);
      return true; // 阻止修改
    },
    // 处理其他钩子如 get 等
  });
}

const readOnlyState = readonly(state);

console.log(readOnlyState.count); // 输出: 1
readOnlyState.count = 2; // 不会修改成功,且会产生警告

3.ref:

ref 函数接受一个值,并返回一个包装后的对象,使其具有响应式属性 value

javascript 复制代码
function ref(value) {
  return reactive({ value });
}

const count = ref(0);

console.log(count.value); // 输出: 0
count.value = 3; // 触发更新

以上示例只是简单地演示了这些 API 的基本原理,实际的 Vue 3 源码中还有更多复杂的逻辑和处理。不断学习中,有问题麻烦帮忙指出,感谢!

相关推荐
Kagol5 分钟前
深入浅出 TinyEditor 富文本编辑器系列之一:TinyEditor 是什么
前端·typescript·开源
超绝大帅哥18 分钟前
为什么回调函数不是一种好的异步编程方式
javascript
不务正业的前端学徒21 分钟前
手写简单的call bind apply
前端
jump_jump24 分钟前
Ripple:一个现代的响应式 UI 框架
前端·javascript·前端框架
用户9047066835732 分钟前
Nuxt css 如何写?
前端
神秘的猪头32 分钟前
🎨 CSS 这种“烂大街”的技术,怎么在 React 和 Vue 里玩出花来?—— 模块化 CSS 深度避坑指南
css·vue.js·react.js
夏天想33 分钟前
element-plus的输入数字组件el-input-number 显示了 加减按钮(+ -) 和 小三角箭头(上下箭头),怎么去掉+,-或者箭头
前端·javascript·vue.js
0思必得035 分钟前
[Web自动化] Selenium基础介绍
前端·python·selenium·自动化·web自动化
Filotimo_37 分钟前
前端.d.ts文件作用
前端
进击的野人37 分钟前
Vue 3 响应式数据解构:toRef 与 toRefs 的深度解析
前端·vue.js·前端框架