feat(reactivity): 实现响应式系统基础功能

- 新增 baseHandlers.ts 文件,定义响应性 handler
- 在 reactivity 模块中导出 reactive 函数
- 将 vue 主入口改为导出 reactive,移除测试代码
- 添加 reactive.html 示例文件用于测试响应式功能
- 实现 reactive 函数,支持创建复杂数据类型的响应式对象
- 使用 WeakMap 缓存代理对象,避免重复代理
This commit is contained in:
dj
2026-02-03 18:14:33 +08:00
parent d4684f288e
commit d3fea3f244
5 changed files with 66 additions and 4 deletions

View File

@@ -0,0 +1,4 @@
/**
* 响应性的handler
*/
export const mutableHandlers: ProxyHandler<object> = {}

View File

@@ -1 +1 @@
let msg = '测试'
export { reactive } from './reactive'

View File

@@ -0,0 +1,41 @@
import { mutableHandlers } from './baseHandlers'
/**
* 响应性Map缓存对象
* key:target
* val:proxy
*/
export const reactiveMap = new WeakMap<object, any>()
/**
* 为复杂数据类型, 创建响应式对象
* @param target 被代理的对象
* @returns 代理对象
*/
export function reactive(target: object) {
return createReactiveObject(target, mutableHandlers, reactiveMap)
}
/**
* 创建响应式对象
* @param target 被代理对象
* @param baseHandlers handler
* @param proxyMap
*/
function createReactiveObject(
target: object,
baseHandlers: ProxyHandler<any>,
proxyMap: WeakMap<object, any>
) {
//如果该实例已经被代理, 则直接读取即可
const existingProxy = proxyMap.get(target)
if (existingProxy) {
return existingProxy
}
//未被代理则生成proxy实例
const proxy = new Proxy(target, baseHandlers)
//缓存代理对象
proxyMap.set(target, proxy)
return proxy
}