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

相关推荐
meilindehuzi_a32 分钟前
Vue3组件样式隔离与组件通信实战:从 scoped、props 校验到记事本应用
前端·javascript·vue.js
LaughingZhu33 分钟前
Product Hunt 每日热榜 | 2026-07-28
前端·神经网络·react.js·搜索引擎·前端框架
陈随易8 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js8 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC8 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端8 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas9 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手9 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武11 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser12 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化