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 源码中还有更多复杂的逻辑和处理。不断学习中,有问题麻烦帮忙指出,感谢!

相关推荐
vvilkim1 分钟前
使用 JavaScript 和 HTML5 实现强大的表单验证
开发语言·javascript·html5
写完这行代码打球去1 分钟前
没有与此调用匹配的重载
前端·javascript·vue.js
华科云商xiao徐1 分钟前
使用CPR库编写的爬虫程序
前端
狂炫一碗大米饭4 分钟前
Event Loop事件循环机制,那是什么事件?又是怎么循环呢?
前端·javascript·面试
IT、木易5 分钟前
大白话Vue Router 中路由守卫(全局守卫、路由独享守卫、组件内守卫)的种类及应用场景
前端·javascript·vue.js
用户63326312819996 分钟前
Kotlin协程:Continuation 和 suspend 函数的编译后逻辑
javascript
顾林海6 分钟前
JavaScript 变量与常量全面解析
前端·javascript
程序员小续6 分钟前
React 组件库:跨版本兼容的解决方案!
前端·react.js·面试
乐坏小陈7 分钟前
2025 年你希望用到的现代 JavaScript 模式 【转载】
前端·javascript
生在地上要上天8 分钟前
从600行"状态地狱"到可维护策略模式:一次列表操作限制重构实践
前端