@feng3d/reactivity 1.0.8 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -21
- package/README.md +158 -158
- package/dist/index.js +208 -46
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +209 -47
- package/dist/index.umd.cjs.map +1 -1
- package/lib/arrayInstrumentations.d.ts.map +1 -1
- package/lib/batch.d.ts.map +1 -1
- package/lib/effectScope.d.ts.map +1 -1
- package/package.json +76 -69
- package/src/ReactiveObject.ts +130 -130
- package/src/Reactivity.ts +168 -168
- package/src/arrayInstrumentations.ts +799 -801
- package/src/baseHandlers.ts +312 -312
- package/src/batch.ts +130 -134
- package/src/collectionHandlers.ts +486 -486
- package/src/computed.ts +253 -253
- package/src/effect.ts +146 -146
- package/src/effectScope.ts +293 -294
- package/src/index.ts +9 -10
- package/src/property.ts +231 -231
- package/src/reactive.ts +186 -186
- package/src/ref.ts +150 -150
- package/src/shared/constants.ts +41 -41
- package/src/shared/general.ts +109 -109
- package/tsconfig.json +21 -20
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/Reactivity.ts","../src/batch.ts","../src/computed.ts","../src/shared/constants.ts","../src/shared/general.ts","../src/effectScope.ts","../src/effect.ts","../src/property.ts","../src/arrayInstrumentations.ts","../src/ref.ts","../src/baseHandlers.ts","../src/collectionHandlers.ts","../src/reactive.ts","../src/ReactiveObject.ts"],"sourcesContent":["import { type ComputedReactivity } from './computed';\r\n\r\n/**\r\n * 反应式节点基类。\r\n *\r\n * 拥有节点值以及被捕捉与触发的能力。\r\n * 用于被 computed、effect 等构建的节点所继承。\r\n *\r\n * 实现了响应式系统的核心功能:\r\n * 1. 值的存储和访问\r\n * 2. 依赖关系的建立(track)\r\n * 3. 变更通知的传播(trigger)\r\n */\r\nexport class Reactivity<T = any>\r\n{\r\n /**\r\n * 获取当前节点值。\r\n *\r\n * 取值时将会建立与父节点的依赖关系。\r\n * 当其他响应式节点访问此值时,会自动建立依赖关系。\r\n */\r\n get value(): T\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n _value: T;\r\n\r\n /**\r\n * 父反应节点集合。\r\n *\r\n * 记录了哪些节点依赖了当前节点。\r\n * 当当前节点值发生变化时,会通知所有父节点。\r\n *\r\n * Map 的 key 是父节点,value 是父节点的版本号。\r\n * 版本号用于判断依赖关系是否过期。\r\n *\r\n * @private\r\n */\r\n _parents = new Map<ComputedReactivity, number>();\r\n\r\n /**\r\n * 建立依赖关系。\r\n *\r\n * 当其他节点访问当前节点的值时,会调用此方法。\r\n * 将当前节点与访问者(父节点)建立依赖关系。\r\n *\r\n * 如果当前没有活动的响应式节点,或者不应该跟踪依赖,则不会建立依赖关系。\r\n */\r\n track()\r\n {\r\n if (!Reactivity.activeReactivity || !_shouldTrack) return;\r\n\r\n // 连接父节点和子节点。\r\n const parent = Reactivity.activeReactivity;\r\n\r\n if (parent)\r\n {\r\n this._parents.set(parent, parent._version);\r\n }\r\n }\r\n\r\n /**\r\n * 触发更新。\r\n *\r\n * 当节点值发生变化时,会调用此方法。\r\n * 通知所有依赖此节点的父节点进行更新。\r\n *\r\n * 更新过程:\r\n * 1. 遍历所有父节点\r\n * 2. 检查父节点的版本号是否匹配\r\n * 3. 触发父节点的更新\r\n * 4. 将当前节点添加到父节点的失效子节点集合中\r\n */\r\n trigger()\r\n {\r\n // 冒泡到所有父节点,设置失效子节点字典。\r\n this._parents.forEach((version, parent) =>\r\n {\r\n if (parent._version !== version) return;\r\n\r\n parent.trigger();\r\n // 失效时添加子节点到父节点中。\r\n parent._children.set(this, this._value);\r\n });\r\n\r\n //\r\n this._parents.clear();\r\n }\r\n\r\n /**\r\n * 当前正在执行的反应式节点。\r\n *\r\n * 用于在依赖收集过程中标识当前正在执行的节点。\r\n * 当其他节点访问此节点的值时,会将其作为父节点。\r\n *\r\n * @internal\r\n */\r\n static activeReactivity: ComputedReactivity;\r\n}\r\n\r\n/**\r\n * 反应式节点链。\r\n *\r\n * 用于表示响应式节点之间的依赖关系链。\r\n * 每个节点包含:\r\n * 1. 节点本身\r\n * 2. 节点的值\r\n * 3. 下一个节点的引用\r\n */\r\nexport type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };\r\n\r\n/**\r\n * 强制跟踪依赖。\r\n *\r\n * 在函数执行期间强制启用依赖跟踪。\r\n * 即使当前处于不跟踪状态,也会建立依赖关系。\r\n *\r\n * @param fn 要执行的函数\r\n * @returns 函数的执行结果\r\n */\r\nexport function forceTrack<T>(fn: () => T): T\r\n{\r\n const preShouldTrack = _shouldTrack;\r\n\r\n _shouldTrack = true;\r\n const result = fn();\r\n\r\n _shouldTrack = preShouldTrack;\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 禁用依赖跟踪。\r\n *\r\n * 在函数执行期间禁用依赖跟踪。\r\n * 即使当前处于跟踪状态,也不会建立依赖关系。\r\n *\r\n * @param fn 要执行的函数\r\n * @returns 函数的执行结果\r\n */\r\nexport function noTrack<T>(fn: () => T): T\r\n{\r\n const preShouldTrack = _shouldTrack;\r\n\r\n _shouldTrack = false;\r\n const result = fn();\r\n\r\n _shouldTrack = preShouldTrack;\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 是否应该跟踪依赖的标志。\r\n *\r\n * 控制是否进行依赖跟踪。\r\n * 可以通过 forceTrack 和 noTrack 函数临时修改此值。\r\n *\r\n * @private\r\n */\r\nlet _shouldTrack = true;\r\n","import { ComputedReactivity } from './computed';\r\nimport { Reactivity } from './Reactivity';\r\n\r\n/**\r\n * 合批处理依赖。\r\n *\r\n * 将依赖添加到待处理队列中,根据依赖的运行状态决定处理方式:\r\n * 1. 如果依赖正在运行,添加到已运行队列\r\n * 2. 如果依赖未运行,添加到待运行队列\r\n *\r\n * @param dep 要处理的依赖\r\n * @param isRunning 依赖是否正在运行\r\n */\r\nexport function batch(dep: ComputedReactivity, isRunning: boolean): void\r\n{\r\n if (isRunning)\r\n {\r\n const index = _isRunedDeps.indexOf(dep);\r\n\r\n if (index !== -1)\r\n {\r\n console.warn('dep already in _isRunedDeps');\r\n // _isRunedDeps.splice(index, 1);\r\n }\r\n\r\n _isRunedDeps.push(dep);\r\n }\r\n else\r\n {\r\n const index = _needEffectDeps.indexOf(dep);\r\n\r\n if (index !== -1)\r\n {\r\n console.warn('dep already in _needEffectDeps,存在多重依赖问题。可能是由于副作用中多次修改了同一个响应式对象。');\r\n // _needEffectDeps.splice(index, 1);\r\n }\r\n\r\n _needEffectDeps.push(dep);\r\n }\r\n}\r\n\r\n/**\r\n * 批次执行多次修改反应式对象。\r\n *\r\n * 将多个响应式更新合并为一个批次执行,可以减少不必要的反应式触发。\r\n * 在批次执行期间:\r\n * 1. 所有响应式更新都会被收集\r\n * 2. 批次结束后统一处理所有更新\r\n * 3. 避免中间状态触发不必要的更新\r\n *\r\n * 示例:\r\n * ```ts\r\n * batchRun(() => {\r\n * // 修改反应式对象\r\n * reactiveObj.a = 1;\r\n * reactiveObj.b = 2;\r\n * })\r\n * ```\r\n *\r\n * @param fn 要执行的函数,在此函数中多次修改反应式对象\r\n * @returns 函数的执行结果\r\n */\r\nexport function batchRun<T>(fn: () => T): T\r\n{\r\n _batchDepth++;\r\n\r\n const result = fn();\r\n\r\n if (--_batchDepth > 0)\r\n {\r\n return;\r\n }\r\n\r\n // 处理已经运行过的依赖\r\n if (_isRunedDeps.length > 0)\r\n {\r\n _isRunedDeps.forEach((dep) =>\r\n {\r\n // 此时依赖以及子依赖都已经运行过了,只需修复与子节点关系\r\n __DEV__ && console.assert(dep._isDirty === false, 'dep.dirty === false');\r\n\r\n // 修复与子节点关系\r\n dep._children.forEach((version, node) =>\r\n {\r\n node._parents.set(dep, dep._version);\r\n });\r\n dep._children.clear();\r\n });\r\n _isRunedDeps.length = 0;\r\n }\r\n\r\n // 批次处理待运行的依赖\r\n if (_needEffectDeps.length > 0)\r\n {\r\n _needEffectDeps.forEach((dep) =>\r\n {\r\n // 独立执行回调,避免影响其他依赖\r\n const pre = Reactivity.activeReactivity;\r\n\r\n Reactivity.activeReactivity = null;\r\n\r\n dep.runIfDirty();\r\n\r\n Reactivity.activeReactivity = pre;\r\n });\r\n _needEffectDeps.length = 0;\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * 批次深度。\r\n *\r\n * 用于跟踪嵌套的批次执行。\r\n * 当深度大于 0 时,表示当前正在批次执行中。\r\n */\r\nlet _batchDepth = 0;\r\n\r\n/**\r\n * 待运行的依赖队列。\r\n *\r\n * 存储需要执行但尚未执行的依赖。\r\n * 在批次执行结束后,会统一处理这些依赖。\r\n */\r\nconst _needEffectDeps: ComputedReactivity[] = [];\r\n\r\n/**\r\n * 已运行的依赖队列。\r\n *\r\n * 存储已经执行过的依赖。\r\n * 这些依赖只需要修复与子节点的关系,不需要重新执行。\r\n */\r\nconst _isRunedDeps: ComputedReactivity[] = [];\r\n","import { batch } from './batch';\r\nimport { Reactivity, forceTrack } from './Reactivity';\r\n\r\n/**\r\n * 创建计算反应式对象。\r\n *\r\n * 计算属性会缓存计算结果,只有当依赖发生变化时才会重新计算。\r\n *\r\n * @param func 计算函数,可以访问其他响应式数据,并返回计算结果\r\n * @returns 包含 value 属性的计算属性对象\r\n */\r\nexport function computed<T>(func: (oldValue?: T) => T): Computed<T>\r\n{\r\n return new ComputedReactivity(func) as any;\r\n}\r\n\r\n/**\r\n * 计算属性接口。\r\n *\r\n * 定义了计算属性的基本结构:\r\n * 1. value: 计算属性的当前值\r\n * 2. ComputedSymbol: 用于标识这是一个计算属性\r\n */\r\nexport interface Computed<T = any>\r\n{\r\n readonly value: T\r\n [ComputedSymbol]: true\r\n}\r\ndeclare const ComputedSymbol: unique symbol;\r\n\r\n/**\r\n * 计算反应式节点接口。\r\n *\r\n * 继承自 Computed 接口,表示这是一个计算反应式节点。\r\n */\r\nexport interface ComputedReactivity<T = any> extends Computed<T> { }\r\n\r\n/**\r\n * 计算反应式节点类。\r\n *\r\n * 当使用 computed 函数时,会创建一个 ComputedReactivity 对象。\r\n * 实现了计算属性的核心功能:\r\n * 1. 缓存计算结果\r\n * 2. 按需重新计算\r\n * 3. 依赖追踪\r\n * 4. 变更通知\r\n */\r\nexport class ComputedReactivity<T = any> extends Reactivity<T>\r\n{\r\n /**\r\n * 标识这是一个 ref 对象。\r\n *\r\n * @internal\r\n */\r\n readonly __v_isRef = true;\r\n\r\n /**\r\n * 计算函数。\r\n *\r\n * 用于计算属性值的函数,可以访问其他响应式数据。\r\n * 当依赖发生变化时,会重新执行此函数。\r\n */\r\n protected _func: (oldValue?: T) => T;\r\n\r\n /**\r\n * 失效子节点集合。\r\n *\r\n * 记录所有依赖此计算属性的子节点。\r\n * 当计算属性重新计算时,会通知这些子节点。\r\n *\r\n * @private\r\n */\r\n _children = new Map<Reactivity, any>();\r\n\r\n /**\r\n * 脏标记。\r\n *\r\n * 表示计算属性是否需要重新计算。\r\n * 当依赖发生变化时,会设置此标记。\r\n * 重新计算后会清除此标记。\r\n *\r\n * @private\r\n */\r\n _isDirty = true;\r\n\r\n /**\r\n * 版本号。\r\n *\r\n * 每次重新计算后自动递增。\r\n * 用于判断子节点中的父节点引用是否过期。\r\n * 当子节点发现父节点的版本号不匹配时,会重新建立依赖关系。\r\n *\r\n * @private\r\n */\r\n _version = -1;\r\n\r\n /**\r\n * 获取计算属性的值。\r\n *\r\n * 取值时会:\r\n * 1. 检查是否需要重新计算\r\n * 2. 建立与父节点的依赖关系\r\n * 3. 返回当前值\r\n */\r\n get value(): T\r\n {\r\n this.runIfDirty();\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n\r\n /**\r\n * 创建计算反应式节点。\r\n *\r\n * @param func 计算函数,可以访问其他响应式数据,并返回计算结果\r\n */\r\n constructor(func: (oldValue?: T) => T)\r\n {\r\n super();\r\n this._func = func;\r\n }\r\n\r\n /**\r\n * 触发更新。\r\n *\r\n * 当依赖发生变化时,会调用此方法。\r\n * 如果当前正在执行计算,会将更新延迟到计算完成后。\r\n * 否则,立即通知所有父节点进行更新。\r\n */\r\n trigger(): void\r\n {\r\n // 正在运行时被触发,需要在运行结束后修复父子节点关系\r\n if (Reactivity.activeReactivity === this)\r\n {\r\n batch(this, Reactivity.activeReactivity === this);\r\n }\r\n\r\n super.trigger();\r\n }\r\n\r\n /**\r\n * 执行计算。\r\n *\r\n * 执行计算函数,更新当前值。\r\n * 在计算过程中会:\r\n * 1. 强制启用依赖跟踪\r\n * 2. 保存并设置当前活动节点\r\n * 3. 执行计算函数\r\n * 4. 恢复活动节点\r\n */\r\n run()\r\n {\r\n // 不受嵌套的 effect 影响\r\n forceTrack(() =>\r\n {\r\n // 保存当前节点作为父节点\r\n const parentReactiveNode = Reactivity.activeReactivity;\r\n\r\n // 设置当前节点为活跃节点\r\n Reactivity.activeReactivity = this as any;\r\n\r\n this._version++;\r\n this._value = this._func(this._value);\r\n\r\n // 执行完毕后恢复父节点\r\n Reactivity.activeReactivity = parentReactiveNode;\r\n });\r\n }\r\n\r\n /**\r\n * 检查并执行计算。\r\n *\r\n * 检查当前节点是否需要重新计算:\r\n * 1. 如果脏标记为 true,需要重新计算\r\n * 2. 如果子节点发生变化,需要重新计算\r\n *\r\n * 重新计算后会清除脏标记。\r\n */\r\n runIfDirty()\r\n {\r\n // 检查是否存在失效子节点字典\r\n this._isDirty = this._isDirty || this.isChildrenChanged();\r\n\r\n // 标记为脏的情况下,执行计算\r\n if (this._isDirty)\r\n {\r\n // 立即去除脏标记,避免循环多重计算\r\n this._isDirty = false;\r\n\r\n // 执行计算\r\n this.run();\r\n }\r\n }\r\n\r\n /**\r\n * 检查子节点是否发生变化。\r\n *\r\n * 遍历所有子节点,检查它们的值是否发生变化。\r\n * 如果发生变化,返回 true,否则返回 false。\r\n *\r\n * 在检查过程中会:\r\n * 1. 临时禁用依赖跟踪\r\n * 2. 检查每个子节点的值\r\n * 3. 如果子节点没有变化,重新建立依赖关系\r\n * 4. 清空子节点集合\r\n *\r\n * @returns 是否有子节点发生变化\r\n */\r\n protected isChildrenChanged()\r\n {\r\n if (this._children.size === 0) return false;\r\n\r\n // 检查是否存在子节点发生变化\r\n let isChanged = false;\r\n\r\n // 避免在检查过程建立依赖关系\r\n const preReactiveNode = Reactivity.activeReactivity;\r\n\r\n Reactivity.activeReactivity = null;\r\n\r\n // 检查子节点是否发生变化\r\n this._children.forEach((value, node) =>\r\n {\r\n if (isChanged) return;\r\n if (node.value !== value)\r\n {\r\n // 子节点变化,需要重新计算\r\n isChanged = true;\r\n\r\n return;\r\n }\r\n });\r\n\r\n // 恢复父节点\r\n Reactivity.activeReactivity = preReactiveNode;\r\n\r\n if (!isChanged)\r\n {\r\n // 修复与子节点关系\r\n this._children.forEach((version, node) =>\r\n {\r\n node._parents.set(this, this._version);\r\n });\r\n }\r\n\r\n // 清空子节点\r\n this._children.clear();\r\n\r\n return isChanged;\r\n }\r\n}\r\n\r\n","/**\r\n * 响应式标志枚举,用于标识响应式对象的特殊属性或状态\r\n */\r\nexport enum ReactiveFlags\r\n{\r\n IS_REACTIVE = '__v_isReactive', // 标识对象是否为响应式对象\r\n RAW = '__v_raw', // 获取对象的原始非响应式版本\r\n IS_REF = '__v_isRef', // 标识对象是否为 ref 对象\r\n}\r\n\r\nexport enum TargetType\r\n{\r\n INVALID = 0,\r\n COMMON = 1,\r\n COLLECTION = 2,\r\n}\r\n\r\n/**\r\n * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型\r\n */\r\nexport enum TrackOpTypes\r\n{\r\n GET = 'get', // 获取属性值\r\n HAS = 'has', // 检查属性是否存在\r\n ITERATE = 'iterate', // 遍历对象属性\r\n}\r\n\r\n/**\r\n * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型\r\n */\r\nexport enum TriggerOpTypes\r\n{\r\n SET = 'set', // 设置属性值\r\n ADD = 'add', // 添加新属性\r\n DELETE = 'delete', // 删除属性\r\n CLEAR = 'clear', // 清空对象属性\r\n}\r\n\r\nexport const ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Object iterate' : '');\r\nexport const MAP_KEY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Map keys iterate' : '');\r\nexport const ARRAY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Array iterate' : '');\r\n","/* eslint-disable no-var */\r\nimport { ReactiveFlags, TargetType } from './constants';\r\n\r\nexport { };\r\ndeclare global\r\n{\r\n /**\r\n * 是否为开发模式。\r\n */\r\n var __DEV__: boolean;\r\n}\r\nglobalThis.__DEV__ ??= true;\r\n\r\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object';\r\n// 判断是否为数组\r\nexport const isArray: typeof Array.isArray = Array.isArray;\r\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol';\r\nexport const isString = (val: unknown): val is string => typeof val === 'string';\r\nexport const isIntegerKey = (key: unknown): boolean =>\r\n isString(key)\r\n && key !== 'NaN'\r\n && key[0] !== '-'\r\n && `${parseInt(key as any, 10)}` === key;\r\nexport const isMap = (val: unknown): val is Map<any, any> =>\r\n toTypeString(val) === '[object Map]';\r\n\r\n// 判断对象是否拥有指定属性\r\nexport const hasOwn = (\r\n val: object,\r\n key: string | symbol,\r\n): key is keyof typeof val => Object.prototype.hasOwnProperty.call(val, key);\r\n\r\n// 比较两个值是否发生变化,考虑 NaN 的情况\r\nexport const hasChanged = (value: any, oldValue: any): boolean =>\r\n !Object.is(value, oldValue);\r\n\r\nfunction targetTypeMap(rawType: string)\r\n{\r\n switch (rawType)\r\n {\r\n case 'Object':\r\n case 'Array':\r\n return TargetType.COMMON;\r\n case 'Map':\r\n case 'Set':\r\n case 'WeakMap':\r\n case 'WeakSet':\r\n return TargetType.COLLECTION;\r\n default:\r\n return TargetType.COMMON;\r\n }\r\n}\r\n\r\nexport function getTargetType(value: Target)\r\n{\r\n if (!Object.isExtensible(value)) return TargetType.INVALID;\r\n\r\n return targetTypeMap(toRawType(value));\r\n}\r\n\r\nconst toTypeString = (value: unknown): string => Object.prototype.toString.call(value);\r\n\r\n// 获取值的原始类型\r\nexport const toRawType = (value: unknown): string =>\r\n\r\n // 从类似 \"[object RawType]\" 的字符串中提取 \"RawType\"\r\n toTypeString(value).slice(8, -1);\r\n\r\nexport interface Target\r\n{\r\n [ReactiveFlags.IS_REACTIVE]?: boolean\r\n [ReactiveFlags.RAW]?: any\r\n}\r\n\r\n/**\r\n * 将一个响应式对象转换为原始对象。\r\n * @param observed 响应式对象。\r\n * @returns 原始对象。\r\n */\r\nexport function toRaw<T>(observed: T): T\r\n{\r\n const raw = observed && (observed as Target)[ReactiveFlags.RAW];\r\n\r\n return raw ? toRaw(raw) : observed;\r\n}\r\n\r\nexport function warn(msg: string, ...args: any[]): void\r\n{\r\n console.warn(`[Vue warn] ${msg}`, ...args);\r\n}\r\n\r\n/**\r\n * 创建一个映射,并返回一个用于检查键是否存在于该映射中的函数。\r\n * 重要提示:所有调用此函数的地方都必须以 \\/\\*#\\_\\_PURE\\_\\_\\*\\/ 作为前缀,\r\n * 以便在必要时 Rollup 可以进行 tree-shaking。\r\n */\r\n\r\n/* ! #__NO_SIDE_EFFECTS__ */\r\nexport function makeMap(str: string): (key: string) => boolean\r\n{\r\n // 创建一个空对象作为映射,使用 Object.create(null) 避免原型链上的属性干扰\r\n const map = Object.create(null);\r\n\r\n // 将输入的字符串按逗号分隔,遍历每个键并将其添加到映射中,值为 1\r\n for (const key of str.split(',')) map[key] = 1;\r\n\r\n // 返回一个函数,该函数接受一个键值,并检查该键是否存在于映射中\r\n return (val) => val in map;\r\n}\r\n","import type { Effect as ReactiveEffect } from './effect';\r\nimport { warn } from './shared/general';\r\n\r\n/**\r\n * 当前活动的效果作用域\r\n */\r\nexport let activeEffectScope: EffectScope | undefined;\r\n\r\n/**\r\n * 效果作用域类\r\n *\r\n * 用于管理一组相关的响应式效果,可以统一控制它们的生命周期。\r\n */\r\nexport class EffectScope\r\n{\r\n /**\r\n * 作用域是否处于活动状态\r\n * @internal\r\n */\r\n private _active = true;\r\n /**\r\n * 跟踪 on 方法的调用次数,允许多次调用 on 方法\r\n * @internal\r\n */\r\n private _on = 0;\r\n /**\r\n * 存储当前作用域中的所有效果\r\n * @internal\r\n */\r\n effects: ReactiveEffect[] = [];\r\n /**\r\n * 存储清理函数\r\n * @internal\r\n */\r\n cleanups: (() => void)[] = [];\r\n\r\n /**\r\n * 作用域是否被暂停\r\n */\r\n private _isPaused = false;\r\n\r\n /**\r\n * 父作用域,仅由非分离的作用域分配\r\n * @internal\r\n */\r\n parent: EffectScope | undefined;\r\n /**\r\n * 记录未分离的子作用域\r\n * @internal\r\n */\r\n scopes: EffectScope[] | undefined;\r\n /**\r\n * 在父作用域的 scopes 数组中记录子作用域的索引,用于优化移除操作\r\n * @internal\r\n */\r\n private index: number | undefined;\r\n\r\n /**\r\n * 构造函数\r\n * @param detached 是否创建分离的作用域\r\n */\r\n constructor(public detached = false)\r\n {\r\n this.parent = activeEffectScope;\r\n if (!detached && activeEffectScope)\r\n {\r\n this.index =\r\n (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\r\n this,\r\n ) - 1;\r\n }\r\n }\r\n\r\n /**\r\n * 获取作用域是否处于活动状态\r\n */\r\n get active(): boolean\r\n {\r\n return this._active;\r\n }\r\n\r\n /**\r\n * 暂停作用域\r\n *\r\n * 暂停当前作用域及其所有子作用域和效果\r\n */\r\n pause(): void\r\n {\r\n if (this._active)\r\n {\r\n this._isPaused = true;\r\n let i: number, l: number;\r\n\r\n if (this.scopes)\r\n {\r\n for (i = 0, l = this.scopes.length; i < l; i++)\r\n {\r\n this.scopes[i].pause();\r\n }\r\n }\r\n for (i = 0, l = this.effects.length; i < l; i++)\r\n {\r\n this.effects[i].pause();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 恢复作用域\r\n *\r\n * 恢复当前作用域及其所有子作用域和效果\r\n */\r\n resume(): void\r\n {\r\n if (this._active)\r\n {\r\n if (this._isPaused)\r\n {\r\n this._isPaused = false;\r\n let i: number, l: number;\r\n\r\n if (this.scopes)\r\n {\r\n for (i = 0, l = this.scopes.length; i < l; i++)\r\n {\r\n this.scopes[i].resume();\r\n }\r\n }\r\n for (i = 0, l = this.effects.length; i < l; i++)\r\n {\r\n this.effects[i].resume();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 在作用域中运行函数\r\n * @param fn 要运行的函数\r\n * @returns 函数的返回值\r\n */\r\n run<T>(fn: () => T): T | undefined\r\n {\r\n if (this._active)\r\n {\r\n const currentEffectScope = activeEffectScope;\r\n\r\n try\r\n {\r\n activeEffectScope = this;\r\n\r\n return fn();\r\n }\r\n finally\r\n {\r\n activeEffectScope = currentEffectScope;\r\n }\r\n }\r\n else if (__DEV__)\r\n {\r\n warn(`cannot run an inactive effect scope.`);\r\n }\r\n }\r\n\r\n /**\r\n * 前一个作用域\r\n */\r\n prevScope: EffectScope | undefined;\r\n /**\r\n * 激活作用域\r\n * 仅应在非分离的作用域上调用\r\n * @internal\r\n */\r\n on(): void\r\n {\r\n if (++this._on === 1)\r\n {\r\n this.prevScope = activeEffectScope;\r\n activeEffectScope = this;\r\n }\r\n }\r\n\r\n /**\r\n * 停用作用域\r\n * 仅应在非分离的作用域上调用\r\n * @internal\r\n */\r\n off(): void\r\n {\r\n if (this._on > 0 && --this._on === 0)\r\n {\r\n activeEffectScope = this.prevScope;\r\n this.prevScope = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 停止作用域\r\n *\r\n * 停止当前作用域及其所有子作用域和效果,并执行清理函数\r\n * @param fromParent 是否由父作用域调用\r\n */\r\n stop(fromParent?: boolean): void\r\n {\r\n if (this._active)\r\n {\r\n this._active = false;\r\n let i: number, l: number;\r\n\r\n for (i = 0, l = this.effects.length; i < l; i++)\r\n {\r\n this.effects[i].stop();\r\n }\r\n this.effects.length = 0;\r\n\r\n for (i = 0, l = this.cleanups.length; i < l; i++)\r\n {\r\n this.cleanups[i]();\r\n }\r\n this.cleanups.length = 0;\r\n\r\n if (this.scopes)\r\n {\r\n for (i = 0, l = this.scopes.length; i < l; i++)\r\n {\r\n this.scopes[i].stop(true);\r\n }\r\n this.scopes.length = 0;\r\n }\r\n\r\n // 嵌套作用域,从父作用域中解除引用以避免内存泄漏\r\n if (!this.detached && this.parent && !fromParent)\r\n {\r\n // 优化的 O(1) 移除\r\n const last = this.parent.scopes!.pop();\r\n\r\n if (last && last !== this)\r\n {\r\n this.parent.scopes![this.index!] = last;\r\n last.index = this.index!;\r\n }\r\n }\r\n this.parent = undefined;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 创建效果作用域对象\r\n *\r\n * 可以捕获在其中创建的响应式效果(即计算属性和观察者),以便这些效果可以一起处理。\r\n *\r\n * @param detached 是否创建分离的作用域\r\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#effectscope}\r\n */\r\nexport function effectScope(detached?: boolean): EffectScope\r\n{\r\n return new EffectScope(detached);\r\n}\r\n\r\n/**\r\n * 获取当前活动的效果作用域\r\n *\r\n * @returns 当前活动的效果作用域,如果没有则返回 undefined\r\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#getcurrentscope}\r\n */\r\nexport function getCurrentScope(): EffectScope | undefined\r\n{\r\n return activeEffectScope;\r\n}\r\n\r\n/**\r\n * 在当前活动的效果作用域上注册清理回调\r\n *\r\n * 当关联的效果作用域停止时,将调用此回调函数。\r\n *\r\n * @param fn 要附加到作用域清理的回调函数\r\n * @param failSilently 是否静默失败\r\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#onscopedispose}\r\n */\r\nexport function onScopeDispose(fn: () => void, failSilently = false): void\r\n{\r\n if (activeEffectScope)\r\n {\r\n activeEffectScope.cleanups.push(fn);\r\n }\r\n else if (__DEV__ && !failSilently)\r\n {\r\n warn(\r\n `onScopeDispose() is called when there is no active effect scope` +\r\n ` to be associated with.`,\r\n );\r\n }\r\n}\r\n","import { batch, batchRun } from './batch';\r\nimport { ComputedReactivity } from './computed';\r\nimport { activeEffectScope } from './effectScope';\r\nimport { Reactivity } from './Reactivity';\r\n\r\n/**\r\n * 创建效果反应式节点。\r\n *\r\n * 将会维持反应式效果,当被作用的函数所引用的响应式对象发生变化时,会立即执行 fn 函数。\r\n *\r\n * @param fn 要执行的函数\r\n * @returns 暂停和恢复副作用的函数\r\n *\r\n * 注:\r\n * 1. 与 `@vue/reactivity` 中的 effect 不同,此函数返回的是一个 Effect 对象,而不是一个函数。\r\n * 2. 不希望用户直接执行,而是通过反应式自动触发。\r\n * 3. 真有需求,可以使用 effect(func).run(true) 来代替 @vue/reactivity 中的 effect(func)() 。\r\n *\r\n */\r\nexport function effect<T = any>(fn: () => T): Effect\r\n{\r\n return new EffectReactivity(fn);\r\n}\r\n\r\n/**\r\n * 效果反应式节点。\r\n */\r\nexport class EffectReactivity<T = any> extends ComputedReactivity<T> implements Effect\r\n{\r\n /**\r\n * 是否为启用, 默认为 true。\r\n *\r\n * 启用时,会立即执行函数。\r\n */\r\n private _isEnable = true;\r\n\r\n constructor(func: (oldValue?: T) => T)\r\n {\r\n super(func);\r\n if (activeEffectScope && activeEffectScope.active)\r\n {\r\n activeEffectScope.effects.push(this);\r\n }\r\n this.runIfDirty();\r\n }\r\n\r\n /**\r\n * 暂停效果。\r\n *\r\n * 暂停后,当依赖发生变化时不会自动执行。\r\n */\r\n pause()\r\n {\r\n this._isEnable = false;\r\n }\r\n\r\n /**\r\n * 恢复效果。\r\n *\r\n * 恢复后,当依赖发生变化时会自动执行。\r\n */\r\n resume()\r\n {\r\n if (this._isEnable) return;\r\n this._isEnable = true;\r\n if (EffectReactivity.pausedQueueEffects.has(this))\r\n {\r\n EffectReactivity.pausedQueueEffects.delete(this);\r\n this.trigger();\r\n }\r\n }\r\n\r\n /**\r\n * 停止效果。\r\n *\r\n * 停止后,效果将不再响应依赖的变化。\r\n */\r\n stop()\r\n {\r\n this._isEnable = false;\r\n EffectReactivity.pausedQueueEffects.delete(this);\r\n }\r\n\r\n /**\r\n * 触发效果执行。\r\n *\r\n * 当依赖发生变化时,会调用此方法。\r\n */\r\n trigger()\r\n {\r\n batchRun(() =>\r\n {\r\n super.trigger();\r\n\r\n if (this._isEnable)\r\n {\r\n // 合批时需要判断是否已经运行的依赖。\r\n batch(this, Reactivity.activeReactivity === this);\r\n }\r\n else\r\n {\r\n EffectReactivity.pausedQueueEffects.add(this);\r\n }\r\n });\r\n }\r\n\r\n private static pausedQueueEffects = new WeakSet<EffectReactivity>();\r\n\r\n /**\r\n * 执行当前节点。\r\n *\r\n * 当暂停时将会直接执行被包装的函数。\r\n */\r\n run(): void\r\n {\r\n if (this._isEnable)\r\n {\r\n super.run();\r\n }\r\n else\r\n {\r\n this._func(this._value);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 维持反应式效果。\r\n */\r\nexport interface Effect\r\n{\r\n /**\r\n * 暂停。\r\n */\r\n pause: () => void;\r\n\r\n /**\r\n * 恢复。\r\n */\r\n resume: () => void;\r\n\r\n /**\r\n * 停止。\r\n */\r\n stop: () => void;\r\n}\r\n","import { batchRun } from './batch';\r\nimport { Reactivity } from './Reactivity';\r\nimport { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';\r\n\r\n/**\r\n * 反应式属性。\r\n *\r\n * @param target 对象。\r\n * @param key 属性\r\n * @returns 反应式属性。\r\n */\r\nfunction property<T, K extends keyof T>(target: T, key: K)\r\n{\r\n let depsMap = PropertyReactivity._targetMap.get(target);\r\n\r\n if (!depsMap)\r\n {\r\n depsMap = new Map();\r\n PropertyReactivity._targetMap.set(target, depsMap);\r\n }\r\n\r\n //\r\n let dep = depsMap.get(key);\r\n\r\n if (!dep)\r\n {\r\n dep = new PropertyReactivity(target, key);\r\n depsMap.set(key, dep);\r\n }\r\n\r\n return dep;\r\n}\r\n\r\n/**\r\n * 属性反应式节点。\r\n */\r\nexport class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>\r\n{\r\n /**\r\n * 获取当前节点值。\r\n *\r\n * 取值时将会建立与父节点的依赖关系。\r\n */\r\n get value(): T\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n\r\n set value(v)\r\n {\r\n // 处理特殊字段,这些字段\r\n if (this._key === 'length')\r\n {\r\n v = this._target['length'];\r\n }\r\n else if (isSymbol(this._key))\r\n {\r\n v = ~~this._value + 1 as any;\r\n }\r\n if (v === this._value) return;\r\n // 触发属性的变化。\r\n this.trigger();\r\n this._value = v;\r\n }\r\n\r\n private _target: T;\r\n private _key: K;\r\n\r\n constructor(target: T, key: K)\r\n {\r\n super();\r\n this._target = target;\r\n this._key = key;\r\n if (target instanceof Map\r\n || target instanceof WeakMap\r\n )\r\n {\r\n this._value = (target as any as WeakMap<any, any>).get(key);\r\n }\r\n else if (target instanceof Set\r\n || target instanceof WeakSet\r\n )\r\n {\r\n this._value = (target as any as WeakSet<any>).has(key) as any;\r\n }\r\n else\r\n {\r\n this._value = (target as any)[key as any];\r\n }\r\n }\r\n\r\n triggerIfChanged()\r\n {\r\n\r\n }\r\n\r\n /**\r\n * 追踪属性的变化。\r\n *\r\n * 当属性被访问时,将会追踪属性的变化。\r\n *\r\n * @param target 目标对象。\r\n * @param key 属性名。\r\n * @returns\r\n */\r\n static track(target: object, type: TrackOpTypes, key: unknown): void\r\n {\r\n if (!Reactivity.activeReactivity) return;\r\n\r\n const dep = property(target as any, key as any);\r\n\r\n // 取值,建立依赖关系。\r\n dep.track();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();\r\n\r\n /**\r\n * 触发属性的变化。\r\n *\r\n * @param target 目标对象。\r\n * @param type 操作类型。\r\n * @param key 属性名。\r\n * @param newValue 新值。\r\n * @param oldValue 旧值。\r\n * @returns\r\n */\r\n static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void\r\n {\r\n const depsMap = this._targetMap.get(target);\r\n\r\n if (!depsMap) return;\r\n\r\n const run = (dep: PropertyReactivity<any, any> | undefined) =>\r\n {\r\n if (dep)\r\n {\r\n // 触发属性的变化。\r\n dep.value = newValue;\r\n }\r\n };\r\n\r\n batchRun(() =>\r\n {\r\n if (type === TriggerOpTypes.CLEAR)\r\n {\r\n // collection being cleared\r\n // trigger all effects for target\r\n depsMap.forEach(run);\r\n }\r\n else\r\n {\r\n const targetIsArray = isArray(target);\r\n const isArrayIndex = targetIsArray && isIntegerKey(key);\r\n\r\n if (targetIsArray && key === 'length')\r\n {\r\n const newLength = Number(newValue);\r\n\r\n depsMap.forEach((dep, key) =>\r\n {\r\n if (\r\n key === 'length'\r\n || key === ARRAY_ITERATE_KEY\r\n || (!isSymbol(key) && key >= newLength)\r\n )\r\n {\r\n run(dep);\r\n }\r\n });\r\n }\r\n else\r\n {\r\n // schedule runs for SET | ADD | DELETE\r\n if (key !== undefined || depsMap.has(undefined))\r\n {\r\n run(depsMap.get(key));\r\n }\r\n\r\n // schedule ARRAY_ITERATE for any numeric key change (length is handled above)\r\n if (isArrayIndex)\r\n {\r\n run(depsMap.get(ARRAY_ITERATE_KEY));\r\n }\r\n\r\n // also run for iteration key on ADD | DELETE | Map.SET\r\n switch (type)\r\n {\r\n case TriggerOpTypes.ADD:\r\n if (!targetIsArray)\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\r\n }\r\n }\r\n else if (isArrayIndex)\r\n {\r\n // new index added to array -> length changes\r\n run(depsMap.get('length'));\r\n }\r\n break;\r\n case TriggerOpTypes.DELETE:\r\n if (!targetIsArray)\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\r\n }\r\n }\r\n break;\r\n case TriggerOpTypes.SET:\r\n if (isMap(target))\r\n {\r\n run(depsMap.get(ITERATE_KEY));\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable prefer-rest-params */\r\n\r\nimport { batchRun } from './batch';\r\nimport { noTrack } from './Reactivity';\r\nimport { PropertyReactivity } from './property';\r\nimport { isProxy, toReactive } from './reactive';\r\nimport { ARRAY_ITERATE_KEY, TrackOpTypes } from './shared/constants';\r\nimport { isArray, toRaw } from './shared/general';\r\n\r\n/**\r\n * 数组方法增强对象。\r\n *\r\n * 为数组提供响应式增强的方法实现,包括:\r\n * 1. 迭代器方法:Symbol.iterator、entries、keys、values\r\n * 2. 查找方法:includes、indexOf、lastIndexOf、find、findIndex、findLast、findLastIndex\r\n * 3. 遍历方法:forEach、map、filter、some、every、reduce、reduceRight\r\n * 4. 修改方法:push、pop、shift、unshift、splice、toReversed、toSorted、toSpliced\r\n * 5. 其他方法:concat、join\r\n */\r\nexport const arrayInstrumentations: Record<string | symbol, Function> = <any>{\r\n __proto__: null,\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的响应式值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的迭代器\r\n * 2. 自动将迭代的值转换为响应式\r\n * 3. 自动追踪数组的访问\r\n *\r\n * @returns 数组的迭代器\r\n */\r\n [Symbol.iterator]()\r\n {\r\n return iterator(this, Symbol.iterator, toReactive);\r\n },\r\n\r\n /**\r\n * 连接数组并返回新数组。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式数组的连接\r\n * 2. 自动将参数中的数组转换为响应式\r\n * 3. 保持原始值的引用\r\n *\r\n * @param args 要连接的数组或值\r\n * @returns 连接后的新数组\r\n */\r\n concat(...args: unknown[])\r\n {\r\n return reactiveReadArray(this).concat(\r\n ...args.map((x) => (isArray(x) ? reactiveReadArray(x) : x)),\r\n );\r\n },\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的键值对。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的键值对迭代器\r\n * 2. 自动将值转换为响应式\r\n * 3. 自动追踪数组的访问\r\n *\r\n * @returns 数组的键值对迭代器\r\n */\r\n entries()\r\n {\r\n return iterator(this, 'entries', (value: [number, unknown]) =>\r\n {\r\n value[1] = toReactive(value[1]);\r\n\r\n return value;\r\n });\r\n },\r\n\r\n /**\r\n * 测试数组中的所有元素是否都通过了指定函数的测试。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的测试\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 如果所有元素都通过测试则返回 true,否则返回 false\r\n */\r\n every(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'every', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 创建一个新数组,包含通过指定函数测试的所有元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 自动将结果转换为响应式\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 包含通过测试的元素的新数组\r\n */\r\n filter(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'filter', fn, thisArg, (v) => v.map(toReactive), arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的第一个元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 自动将结果转换为响应式\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 第一个满足测试的元素,如果没有则返回 undefined\r\n */\r\n find(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'find', fn, thisArg, toReactive, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的第一个元素的索引。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的查找\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 第一个满足测试的元素的索引,如果没有则返回 -1\r\n */\r\n findIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findIndex', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的最后一个元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 从后向前遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 自动将结果转换为响应式\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 最后一个满足测试的元素,如果没有则返回 undefined\r\n */\r\n findLast(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findLast', fn, thisArg, toReactive, arguments);\r\n },\r\n\r\n /**\r\n * 返回数组中满足指定测试函数的最后一个元素的索引。\r\n *\r\n * 实现了以下功能:\r\n * 1. 从后向前遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的查找\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 最后一个满足测试的元素的索引,如果没有则返回 -1\r\n */\r\n findLastIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'findLastIndex', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n // flat, flatMap 可以从 ARRAY_ITERATE 中受益,但实现起来不太直接\r\n\r\n /**\r\n * 对数组中的每个元素执行指定函数。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行回调函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的遍历\r\n *\r\n * @param fn 回调函数\r\n * @param thisArg 回调函数的 this 值\r\n */\r\n forEach(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'forEach', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 判断数组是否包含指定元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式值的查找\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理代理对象的查找\r\n *\r\n * @param args 要查找的元素\r\n * @returns 如果数组包含该元素则返回 true,否则返回 false\r\n */\r\n includes(...args: unknown[])\r\n {\r\n return searchProxy(this, 'includes' as any, args);\r\n },\r\n\r\n /**\r\n * 返回数组中指定元素第一次出现的索引。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式值的查找\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理代理对象的查找\r\n *\r\n * @param args 要查找的元素\r\n * @returns 元素第一次出现的索引,如果没有则返回 -1\r\n */\r\n indexOf(...args: unknown[])\r\n {\r\n return searchProxy(this, 'indexOf', args);\r\n },\r\n\r\n /**\r\n * 将数组的所有元素连接成一个字符串。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式数组的连接\r\n * 2. 自动追踪数组的访问\r\n * 3. 保持原始值的引用\r\n *\r\n * @param separator 分隔符\r\n * @returns 连接后的字符串\r\n */\r\n join(separator?: string)\r\n {\r\n return reactiveReadArray(this).join(separator);\r\n },\r\n\r\n // keys() 迭代器只读取 length,不需要优化\r\n\r\n /**\r\n * 返回数组中指定元素最后一次出现的索引。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式值的查找\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理代理对象的查找\r\n *\r\n * @param args 要查找的元素\r\n * @returns 元素最后一次出现的索引,如果没有则返回 -1\r\n */\r\n lastIndexOf(...args: unknown[])\r\n {\r\n return searchProxy(this, 'lastIndexOf', args);\r\n },\r\n\r\n /**\r\n * 创建一个新数组,包含对原数组每个元素调用指定函数的结果。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行映射函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的映射\r\n *\r\n * @param fn 映射函数\r\n * @param thisArg 映射函数的 this 值\r\n * @returns 包含映射结果的新数组\r\n */\r\n map(fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'map', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 移除数组的最后一个元素并返回该元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 移除最后一个元素\r\n * 2. 避免跟踪长度变化\r\n * 3. 处理响应式值的移除\r\n *\r\n * @returns 被移除的元素\r\n */\r\n pop()\r\n {\r\n return noTracking(this, 'pop');\r\n },\r\n\r\n /**\r\n * 向数组末尾添加一个或多个元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 添加新元素\r\n * 2. 避免跟踪长度变化\r\n * 3. 处理响应式值的添加\r\n *\r\n * @param args 要添加的元素\r\n * @returns 数组的新长度\r\n */\r\n push(...args: unknown[])\r\n {\r\n return noTracking(this, 'push', args);\r\n },\r\n\r\n /**\r\n * 对数组中的每个元素执行累加器函数。\r\n *\r\n * 实现了以下功能:\r\n * 1. 从左到右遍历数组元素\r\n * 2. 对每个元素执行累加器函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的累加\r\n *\r\n * @param fn 累加器函数\r\n * @param args 初始值(可选)\r\n * @returns 累加的结果\r\n */\r\n reduce(fn: (\r\n acc: unknown,\r\n item: unknown,\r\n index: number,\r\n array: unknown[],\r\n ) => unknown,\r\n ...args: unknown[]\r\n )\r\n {\r\n return reduce(this, 'reduce', fn, args);\r\n },\r\n\r\n /**\r\n * 从右到左对数组中的每个元素执行累加器函数。\r\n *\r\n * 实现了以下功能:\r\n * 1. 从右到左遍历数组元素\r\n * 2. 对每个元素执行累加器函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的累加\r\n *\r\n * @param fn 累加器函数\r\n * @param args 初始值(可选)\r\n * @returns 累加的结果\r\n */\r\n reduceRight(\r\n fn: (\r\n acc: unknown,\r\n item: unknown,\r\n index: number,\r\n array: unknown[],\r\n ) => unknown,\r\n ...args: unknown[]\r\n )\r\n {\r\n return reduce(this, 'reduceRight', fn, args);\r\n },\r\n\r\n /**\r\n * 移除数组的第一个元素并返回该元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 移除第一个元素\r\n * 2. 避免跟踪长度变化\r\n * 3. 处理响应式值的移除\r\n *\r\n * @returns 被移除的元素\r\n */\r\n shift()\r\n {\r\n return noTracking(this, 'shift');\r\n },\r\n\r\n // slice 可以使用 ARRAY_ITERATE,但似乎也需要范围追踪\r\n\r\n /**\r\n * 测试数组中的某些元素是否通过了指定函数的测试。\r\n *\r\n * 实现了以下功能:\r\n * 1. 遍历数组元素\r\n * 2. 对每个元素执行测试函数\r\n * 3. 自动追踪数组的访问\r\n * 4. 处理响应式值的测试\r\n *\r\n * @param fn 测试函数\r\n * @param thisArg 测试函数的 this 值\r\n * @returns 如果有元素通过测试则返回 true,否则返回 false\r\n */\r\n some(\r\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n )\r\n {\r\n return apply(this, 'some', fn, thisArg, undefined, arguments);\r\n },\r\n\r\n /**\r\n * 通过删除或替换现有元素或添加新元素来修改数组。\r\n *\r\n * 实现了以下功能:\r\n * 1. 修改数组内容\r\n * 2. 避免跟踪长度变化\r\n * 3. 处理响应式值的修改\r\n *\r\n * @param args 要删除的起始索引、要删除的元素数量和要添加的元素\r\n * @returns 包含被删除元素的新数组\r\n */\r\n splice(...args: unknown[])\r\n {\r\n return noTracking(this, 'splice', args);\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的反转副本。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的反转副本\r\n * 2. 自动将结果转换为响应式\r\n * 3. 保持原始值的引用\r\n *\r\n * @returns 反转后的新数组\r\n */\r\n toReversed()\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return reactiveReadArray(this).toReversed();\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的排序副本。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的排序副本\r\n * 2. 自动将结果转换为响应式\r\n * 3. 保持原始值的引用\r\n *\r\n * @param comparer 比较函数\r\n * @returns 排序后的新数组\r\n */\r\n toSorted(comparer?: (a: unknown, b: unknown) => number)\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return reactiveReadArray(this).toSorted(comparer);\r\n },\r\n\r\n /**\r\n * 返回一个新数组,包含原数组的切片副本。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的切片副本\r\n * 2. 自动将结果转换为响应式\r\n * 3. 保持原始值的引用\r\n *\r\n * @param args 起始索引和结束索引\r\n * @returns 切片后的新数组\r\n */\r\n toSpliced(...args: unknown[])\r\n {\r\n // @ts-expect-error user code may run in es2016+\r\n return reactiveReadArray(this).toSpliced(...args);\r\n },\r\n\r\n /**\r\n * 向数组开头添加一个或多个元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 添加新元素\r\n * 2. 避免跟踪长度变化\r\n * 3. 处理响应式值的添加\r\n *\r\n * @param args 要添加的元素\r\n * @returns 数组的新长度\r\n */\r\n unshift(...args: unknown[])\r\n {\r\n return noTracking(this, 'unshift', args);\r\n },\r\n\r\n /**\r\n * 返回一个迭代器,用于遍历数组的值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的值迭代器\r\n * 2. 自动将迭代的值转换为响应式\r\n * 3. 自动追踪数组的访问\r\n *\r\n * @returns 数组的值迭代器\r\n */\r\n values()\r\n {\r\n return iterator(this, 'values', toReactive);\r\n },\r\n};\r\n\r\n/**\r\n * 创建数组的迭代器。\r\n *\r\n * 实现了以下功能:\r\n * 1. 创建数组的迭代器\r\n * 2. 自动将迭代的值转换为响应式\r\n * 3. 自动追踪数组的访问\r\n *\r\n * 注意:在这里获取 ARRAY_ITERATE 依赖并不完全等同于在代理数组上调用迭代。\r\n * 创建迭代器时不会访问任何数组属性:\r\n * 只有在调用 .next() 时才会访问 length 和索引。\r\n * 从极端情况来看,迭代器可以在一个 effect scope 中创建,\r\n * 在另一个 scope 中部分迭代,然后在第三个 scope 中继续迭代。\r\n * 考虑到 JS 迭代器只能读取一次,这似乎不是一个合理的用例,\r\n * 所以这种跟踪简化是可以接受的。\r\n *\r\n * @param self 目标数组\r\n * @param method 迭代器方法名\r\n * @param wrapValue 值包装函数,用于将值转换为响应式\r\n * @returns 数组的迭代器\r\n */\r\nfunction iterator(\r\n self: unknown[],\r\n method: keyof Array<unknown>,\r\n wrapValue: (value: any) => unknown,\r\n)\r\n{\r\n const arr = shallowReadArray(self);\r\n const iter = (arr[method] as any)() as IterableIterator<unknown> & {\r\n _next: IterableIterator<unknown>['next']\r\n };\r\n\r\n if (arr !== self)\r\n {\r\n iter._next = iter.next;\r\n iter.next = () =>\r\n {\r\n const result = iter._next();\r\n\r\n if (result.value)\r\n {\r\n result.value = wrapValue(result.value);\r\n }\r\n\r\n return result;\r\n };\r\n }\r\n\r\n return iter;\r\n}\r\n\r\n/**\r\n * 创建数组的浅层响应式副本。\r\n *\r\n * 实现了以下功能:\r\n * 1. 跟踪数组的迭代操作\r\n * 2. 返回原始数组的引用\r\n *\r\n * 注意:此函数只跟踪数组的迭代操作,不会递归转换数组中的值。\r\n * 主要用于优化性能,避免不必要的响应式转换。\r\n *\r\n * @param arr 目标数组\r\n * @returns 数组的浅层响应式副本\r\n */\r\nfunction shallowReadArray<T>(arr: T[]): T[]\r\n{\r\n PropertyReactivity.track((arr = toRaw(arr)), TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * 创建数组的深层响应式副本。\r\n *\r\n * 实现了以下功能:\r\n * 1. 跟踪数组的迭代操作\r\n * 2. 递归转换所有值为响应式\r\n *\r\n * 注意:此函数会递归转换数组中的所有值为响应式,\r\n * 包括嵌套的数组和对象。这可能会导致性能开销,\r\n * 但确保了所有值都是响应式的。\r\n *\r\n * @param array 目标数组\r\n * @returns 数组的深层响应式副本\r\n */\r\nfunction reactiveReadArray<T>(array: T[]): T[]\r\n{\r\n const raw = toRaw(array);\r\n\r\n if (raw === array) return raw;\r\n PropertyReactivity.track(raw, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n\r\n return raw.map(toReactive);\r\n}\r\n\r\n/**\r\n * 数组方法类型。\r\n *\r\n * 包括所有需要增强的数组方法。\r\n * 注意:在代码库中我们强制使用 es2016,但用户代码可能在更高版本的环境中运行。\r\n */\r\ntype ArrayMethods = keyof Array<any> | 'findLast' | 'findLastIndex';\r\n\r\n/**\r\n * 应用数组方法。\r\n *\r\n * 实现了以下功能:\r\n * 1. 调用数组方法\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理回调函数的执行\r\n * 4. 处理返回值的转换\r\n *\r\n * 注意:如果调用的方法来自用户扩展的 Array,参数将是未知的\r\n * (未知顺序和未知参数类型)。在这种情况下,我们跳过 shallowReadArray\r\n * 处理,直接使用 self 调用 apply。\r\n *\r\n * @param self 目标数组\r\n * @param method 方法名\r\n * @param fn 回调函数\r\n * @param thisArg 回调函数的 this 值\r\n * @param wrappedRetFn 返回值包装函数,用于将返回值转换为响应式\r\n * @param args 方法参数\r\n * @returns 方法的执行结果\r\n */\r\nfunction apply(\r\n self: unknown[],\r\n method: ArrayMethods,\r\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\r\n thisArg?: unknown,\r\n wrappedRetFn?: (result: any) => unknown,\r\n args?: IArguments,\r\n)\r\n{\r\n const arr = shallowReadArray(self);\r\n const needsWrap = arr !== self;\r\n const methodFn = arr[method];\r\n\r\n // #11759\r\n // If the method being called is from a user-extended Array, the arguments will be unknown\r\n // (unknown order and unknown parameter types). In this case, we skip the shallowReadArray\r\n // handling and directly call apply with self.\r\n if (methodFn !== Array.prototype[method as any])\r\n {\r\n const result = methodFn.apply(self, args);\r\n\r\n return needsWrap ? toReactive(result) : result;\r\n }\r\n\r\n let wrappedFn = fn;\r\n\r\n if (arr !== self)\r\n {\r\n if (needsWrap)\r\n {\r\n wrappedFn = function (this: unknown, item, index)\r\n {\r\n return fn.call(this, toReactive(item), index, self);\r\n };\r\n }\r\n else if (fn.length > 2)\r\n {\r\n wrappedFn = function (this: unknown, item, index)\r\n {\r\n return fn.call(this, item, index, self);\r\n };\r\n }\r\n }\r\n const result = methodFn.call(arr, wrappedFn, thisArg);\r\n\r\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\r\n}\r\n\r\n/**\r\n * 应用数组的归约方法。\r\n *\r\n * 实现了以下功能:\r\n * 1. 调用数组的归约方法\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理回调函数的执行\r\n * 4. 处理响应式值的归约\r\n *\r\n * 注意:此函数用于处理 reduce 和 reduceRight 方法,\r\n * 确保在归约过程中正确处理响应式值。\r\n *\r\n * @param self 目标数组\r\n * @param method 方法名('reduce' 或 'reduceRight')\r\n * @param fn 归约函数\r\n * @param args 方法参数,包括初始值(可选)\r\n * @returns 归约的结果\r\n */\r\nfunction reduce(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n fn: (acc: unknown, item: unknown, index: number, array: unknown[]) => unknown,\r\n args: unknown[],\r\n)\r\n{\r\n const arr = shallowReadArray(self);\r\n let wrappedFn = fn;\r\n\r\n if (arr !== self)\r\n {\r\n wrappedFn = function (this: unknown, acc, item, index)\r\n {\r\n return fn.call(this, acc, toReactive(item), index, self);\r\n };\r\n }\r\n\r\n return (arr[method] as any)(wrappedFn, ...args);\r\n}\r\n\r\n/**\r\n * 在数组中搜索元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 处理响应式值的搜索\r\n * 2. 自动追踪数组的访问\r\n * 3. 处理代理对象的搜索\r\n *\r\n * 注意:我们首先使用原始参数(可能是响应式的)运行方法。\r\n * 如果那不起作用,我们再次使用原始值运行。\r\n * 这确保了在搜索响应式值时能够正确处理。\r\n *\r\n * @param self 目标数组\r\n * @param method 方法名('includes'、'indexOf' 或 'lastIndexOf')\r\n * @param args 搜索参数\r\n * @returns 搜索的结果(布尔值或索引)\r\n */\r\nfunction searchProxy(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n args: unknown[],\r\n)\r\n{\r\n const arr = toRaw(self) as any;\r\n\r\n PropertyReactivity.track(arr, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\r\n // we run the method using the original args first (which may be reactive)\r\n const res = arr[method](...args);\r\n\r\n // if that didn't work, run it again using raw values.\r\n if ((res === -1 || res === false) && isProxy(args[0]))\r\n {\r\n args[0] = toRaw(args[0]);\r\n\r\n return arr[method](...args);\r\n }\r\n\r\n return res;\r\n}\r\n\r\n/**\r\n * 执行不跟踪的数组操作。\r\n *\r\n * 实现了以下功能:\r\n * 1. 执行数组操作\r\n * 2. 避免跟踪长度变化\r\n * 3. 在批处理中执行操作\r\n *\r\n * 注意:这用于避免在某些情况下(#2137)由于跟踪长度变化而导致的无限循环。\r\n * 通过使用批处理和禁用跟踪,我们可以安全地执行这些操作。\r\n *\r\n * @param self 目标数组\r\n * @param method 方法名('push'、'pop'、'shift'、'unshift' 或 'splice')\r\n * @param args 方法参数\r\n * @returns 操作的执行结果\r\n */\r\nfunction noTracking(\r\n self: unknown[],\r\n method: keyof Array<any>,\r\n args: unknown[] = [],\r\n)\r\n{\r\n const res = batchRun(() =>\r\n noTrack(() =>\r\n (toRaw(self) as any)[method].apply(self, args),\r\n ),\r\n );\r\n\r\n return res;\r\n}\r\n","import { batchRun } from './batch';\r\nimport { Reactivity } from './Reactivity';\r\nimport { toReactive } from './reactive';\r\nimport { ReactiveFlags } from './shared/constants';\r\nimport { hasChanged, toRaw } from './shared/general';\r\n\r\n/**\r\n * 创建一个引用,该引用的值可以被响应式系统追踪和更新。\r\n *\r\n * ref 是响应式系统中最基本的响应式对象。\r\n * 它可以包装任何类型的值,使其成为响应式的。\r\n *\r\n * 特点:\r\n * 1. 可以包装任何类型的值\r\n * 2. 通过 .value 访问和修改值\r\n * 3. 自动解包原始值\r\n * 4. 支持嵌套的响应式对象\r\n *\r\n * @param value 要包装的值\r\n * @returns 包含 value 属性的响应式引用对象\r\n */\r\nexport function ref<T>(value?: T): Ref<T>\r\n{\r\n if (isRef(value))\r\n {\r\n return value as any;\r\n }\r\n\r\n return new RefReactivity<T>(value) as any;\r\n}\r\n\r\n/**\r\n * 判断一个对象是否为引用。\r\n *\r\n * 通过检查对象是否具有 IS_REF 标志来判断。\r\n *\r\n * @param r 要检查的对象\r\n * @returns 如果是引用则返回 true,否则返回 false\r\n */\r\nexport function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;\r\nexport function isRef(r: any): r is Ref\r\n{\r\n return r ? r[ReactiveFlags.IS_REF] === true : false;\r\n}\r\n\r\n/**\r\n * 引用反应式节点接口。\r\n *\r\n * 继承自 Ref 接口,表示这是一个引用反应式节点。\r\n */\r\nexport interface RefReactivity<T = any> extends Ref<T> { }\r\n\r\n/**\r\n * 引用反应式节点类。\r\n *\r\n * 当使用 ref 函数时,会创建一个 RefReactivity 对象。\r\n * 实现了引用的核心功能:\r\n * 1. 值的存储和访问\r\n * 2. 值的自动解包\r\n * 3. 变更通知\r\n * 4. 依赖追踪\r\n */\r\nexport class RefReactivity<T = any> extends Reactivity<T> implements Ref<T>\r\n{\r\n /**\r\n * 标识这是一个 ref 对象。\r\n *\r\n * 用于 isRef 函数判断对象是否为引用。\r\n */\r\n public readonly [ReactiveFlags.IS_REF] = true;\r\n\r\n /**\r\n * 获取引用的值。\r\n *\r\n * 取值时会:\r\n * 1. 建立依赖关系\r\n * 2. 返回当前值\r\n */\r\n get value()\r\n {\r\n this.track();\r\n\r\n return this._value;\r\n }\r\n\r\n /**\r\n * 设置引用的值。\r\n *\r\n * 设置值时会:\r\n * 1. 比较新旧值是否发生变化\r\n * 2. 如果值发生变化,则:\r\n * - 触发更新通知\r\n * - 更新原始值\r\n * - 更新响应式值\r\n *\r\n * @param v 要设置的新值\r\n */\r\n set value(v: T)\r\n {\r\n const oldValue = this._rawValue;\r\n const newValue = toRaw(v);\r\n\r\n if (!hasChanged(oldValue, newValue)) return;\r\n\r\n batchRun(() =>\r\n {\r\n this.trigger();\r\n\r\n this._rawValue = newValue;\r\n this._value = toReactive(newValue);\r\n });\r\n }\r\n\r\n /**\r\n * 原始值。\r\n *\r\n * 存储未经响应式处理的原始值。\r\n * 用于比较值是否发生变化。\r\n *\r\n * @private\r\n */\r\n private _rawValue: T;\r\n\r\n /**\r\n * 创建引用反应式节点。\r\n *\r\n * @param value 要包装的值\r\n */\r\n constructor(value: T)\r\n {\r\n super();\r\n this._rawValue = toRaw(value);\r\n this._value = toReactive(value);\r\n }\r\n}\r\n\r\n/**\r\n * 引用接口。\r\n *\r\n * 定义了引用的基本结构:\r\n * 1. value: 引用的值,可读可写\r\n * 2. RefSymbol: 用于标识这是一个引用\r\n */\r\nexport interface Ref<T = any, S = T>\r\n{\r\n get value(): T\r\n set value(_: S)\r\n [RefSymbol]: true\r\n}\r\ndeclare const RefSymbol: unique symbol;\r\n","import { arrayInstrumentations } from './arrayInstrumentations';\r\nimport { reactive, reactiveMap } from './reactive';\r\nimport { isRef } from './ref';\r\nimport { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';\r\nimport { PropertyReactivity } from './property';\r\n\r\n/**\r\n * 基础响应式处理器。\r\n *\r\n * 实现了 Proxy 的 get 拦截器,用于:\r\n * 1. 响应式对象的标识和原始对象获取\r\n * 2. 数组方法的特殊处理\r\n * 3. 属性的依赖追踪\r\n * 4. 值的自动解包和响应式转换\r\n */\r\nclass BaseReactiveHandler implements ProxyHandler<Target>\r\n{\r\n /**\r\n * 获取对象的属性值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 响应式对象标识检查\r\n * 2. 原始对象获取\r\n * 3. 数组方法拦截\r\n * 4. 属性依赖追踪\r\n * 5. 值的自动解包\r\n * 6. 对象的自动响应式转换\r\n *\r\n * @param target 被代理的原始对象\r\n * @param key 要获取的属性名\r\n * @param receiver 代理对象本身\r\n * @returns 获取到的属性值\r\n */\r\n get(target: Target, key: string | symbol, receiver: object): any\r\n {\r\n // 检查是否为响应式对象\r\n if (key === ReactiveFlags.IS_REACTIVE)\r\n {\r\n return true;\r\n }\r\n // 获取原始对象\r\n else if (key === ReactiveFlags.RAW)\r\n {\r\n if (\r\n receiver === reactiveMap.get(target)\r\n // receiver 不是响应式代理,但具有相同的原型\r\n // 这意味着 receiver 是响应式代理的用户代理\r\n || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)\r\n )\r\n {\r\n return target;\r\n }\r\n\r\n // 提前返回 undefined\r\n return;\r\n }\r\n\r\n const targetIsArray = isArray(target);\r\n\r\n // 处理数组方法\r\n let fn: Function | undefined;\r\n\r\n if (targetIsArray && (fn = arrayInstrumentations[key]))\r\n {\r\n return fn;\r\n }\r\n // 处理 hasOwnProperty 方法\r\n if (key === 'hasOwnProperty')\r\n {\r\n return hasOwnProperty;\r\n }\r\n\r\n // 获取属性值\r\n const res = Reflect.get(\r\n target,\r\n key,\r\n isRef(target) ? target : receiver,\r\n );\r\n\r\n // 跳过内置 Symbol 和非追踪键的依赖追踪\r\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))\r\n {\r\n return res;\r\n }\r\n\r\n // 追踪属性访问\r\n PropertyReactivity.track(target, TrackOpTypes.GET, key as any);\r\n\r\n // 自动解包 ref 值\r\n if (isRef(res))\r\n {\r\n return targetIsArray && isIntegerKey(key) ? res : res.value;\r\n }\r\n\r\n // 自动转换对象为响应式\r\n if (isObject(res))\r\n {\r\n return reactive(res);\r\n }\r\n\r\n return res;\r\n }\r\n}\r\n\r\n/**\r\n * 可变响应式处理器。\r\n *\r\n * 继承自基础响应式处理器,增加了:\r\n * 1. 属性设置拦截\r\n * 2. 属性删除拦截\r\n * 3. 属性存在性检查拦截\r\n * 4. 属性遍历拦截\r\n */\r\nclass MutableReactiveHandler extends BaseReactiveHandler\r\n{\r\n /**\r\n * 设置对象的属性值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 值的原始化处理\r\n * 2. ref 值的特殊处理\r\n * 3. 属性变更通知\r\n * 4. 数组长度的特殊处理\r\n *\r\n * @param target 被代理的原始对象\r\n * @param key 要设置的属性名\r\n * @param value 要设置的新值\r\n * @param receiver 代理对象本身\r\n * @returns 设置是否成功\r\n */\r\n set(\r\n target: Record<string | symbol, unknown>,\r\n key: string | symbol,\r\n value: unknown,\r\n receiver: object,\r\n ): boolean\r\n {\r\n let oldValue = target[key];\r\n\r\n // 获取原始值进行比较\r\n oldValue = toRaw(oldValue);\r\n value = toRaw(value);\r\n\r\n // 处理 ref 值的特殊情况\r\n if (!isArray(target) && isRef(oldValue) && !isRef(value))\r\n {\r\n oldValue.value = value;\r\n\r\n return true;\r\n }\r\n\r\n // 检查属性是否存在\r\n const hadKey\r\n = isArray(target) && isIntegerKey(key)\r\n ? Number(key) < target.length\r\n : hasOwn(target, key);\r\n const result = Reflect.set(\r\n target,\r\n key,\r\n value,\r\n isRef(target) ? target : receiver,\r\n );\r\n\r\n // 确保目标在原始原型链中\r\n __DEV__ && console.assert(target === toRaw(receiver));\r\n\r\n // 触发属性变更通知\r\n if (target === toRaw(receiver))\r\n {\r\n if (!hadKey)\r\n {\r\n // 新增属性\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\r\n }\r\n else if (hasChanged(value, oldValue))\r\n {\r\n // 修改属性\r\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 删除对象的属性。\r\n *\r\n * 实现了以下功能:\r\n * 1. 属性删除操作\r\n * 2. 删除后的变更通知\r\n *\r\n * @param target 被代理的原始对象\r\n * @param key 要删除的属性名\r\n * @returns 删除是否成功\r\n */\r\n deleteProperty(\r\n target: Record<string | symbol, unknown>,\r\n key: string | symbol,\r\n ): boolean\r\n {\r\n const hadKey = hasOwn(target, key);\r\n const oldValue = target[key];\r\n const result = Reflect.deleteProperty(target, key);\r\n\r\n if (result && hadKey)\r\n {\r\n // 触发删除通知\r\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 检查对象是否包含某个属性。\r\n *\r\n * 实现了以下功能:\r\n * 1. 属性存在性检查\r\n * 2. 属性访问依赖追踪\r\n *\r\n * @param target 被代理的原始对象\r\n * @param key 要检查的属性名\r\n * @returns 属性是否存在\r\n */\r\n has(target: Record<string | symbol, unknown>, key: string | symbol): boolean\r\n {\r\n const result = Reflect.has(target, key);\r\n\r\n if (!isSymbol(key) || !builtInSymbols.has(key))\r\n {\r\n // 追踪属性访问\r\n PropertyReactivity.track(target, TrackOpTypes.HAS, key);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * 获取对象的所有属性名。\r\n *\r\n * 实现了以下功能:\r\n * 1. 属性遍历\r\n * 2. 遍历操作的依赖追踪\r\n *\r\n * @param target 被代理的原始对象\r\n * @returns 对象的所有属性名数组\r\n */\r\n ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]\r\n {\r\n // 追踪遍历操作\r\n PropertyReactivity.track(\r\n target,\r\n TrackOpTypes.ITERATE,\r\n isArray(target) ? 'length' : ITERATE_KEY,\r\n );\r\n\r\n return Reflect.ownKeys(target);\r\n }\r\n}\r\n\r\n/**\r\n * 可变响应式处理器实例。\r\n *\r\n * 用于创建可变的响应式对象。\r\n */\r\nexport const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();\r\n\r\n/**\r\n * 自定义 hasOwnProperty 方法。\r\n *\r\n * 实现了以下功能:\r\n * 1. 属性存在性检查\r\n * 2. 属性访问依赖追踪\r\n *\r\n * @param this 调用对象\r\n * @param key 要检查的属性名\r\n * @returns 属性是否存在\r\n */\r\nfunction hasOwnProperty(this: object, key: unknown)\r\n{\r\n // #10455 hasOwnProperty 可能被非字符串值调用\r\n if (!isSymbol(key)) key = String(key);\r\n const obj = toRaw(this);\r\n\r\n // 追踪属性访问\r\n PropertyReactivity.track(obj, TrackOpTypes.HAS, key);\r\n\r\n return obj.hasOwnProperty(key as string);\r\n}\r\n\r\n/**\r\n * 内置 Symbol 集合。\r\n *\r\n * 用于过滤不需要追踪的 Symbol 属性。\r\n */\r\nconst builtInSymbols = new Set(\r\n /* @__PURE__ */\r\n Object.getOwnPropertyNames(Symbol)\r\n // ios10.x Object.getOwnPropertyNames(Symbol) 可以枚举 'arguments' 和 'caller'\r\n // 但在 Symbol 上访问它们会导致 TypeError,因为 Symbol 是严格模式函数\r\n .filter((key) => key !== 'arguments' && key !== 'caller')\r\n .map((key) => Symbol[key as keyof SymbolConstructor])\r\n .filter(isSymbol),\r\n);\r\n\r\n/**\r\n * 非追踪键集合。\r\n *\r\n * 用于过滤不需要追踪的属性名。\r\n */\r\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\r\n","import { toReactive } from './reactive';\r\nimport { ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\r\nimport { hasChanged, hasOwn, isMap, Target, toRaw, toRawType, warn } from './shared/general';\r\nimport { PropertyReactivity } from './property';\r\n\r\n/**\r\n * 可变集合响应式处理器。\r\n *\r\n * 用于处理集合类型(Map、Set、WeakMap、WeakSet)的响应式代理。\r\n * 通过拦截集合的操作方法,实现响应式功能。\r\n */\r\nexport const mutableCollectionHandlers: ProxyHandler<CollectionTypes> = {\r\n get: createInstrumentationGetter(),\r\n};\r\n\r\n/**\r\n * 创建集合方法的拦截器。\r\n *\r\n * 返回一个 get 拦截器函数,用于:\r\n * 1. 处理响应式标识和原始对象获取\r\n * 2. 拦截集合的操作方法\r\n * 3. 转发其他属性访问\r\n *\r\n * @returns 集合方法的拦截器函数\r\n */\r\nfunction createInstrumentationGetter()\r\n{\r\n const instrumentations = createInstrumentations();\r\n\r\n return (\r\n target: CollectionTypes,\r\n key: string | symbol,\r\n receiver: CollectionTypes,\r\n ) =>\r\n {\r\n // 处理响应式标识\r\n if (key === ReactiveFlags.IS_REACTIVE)\r\n {\r\n return true;\r\n }\r\n // 获取原始对象\r\n else if (key === ReactiveFlags.RAW)\r\n {\r\n return target;\r\n }\r\n\r\n // 如果方法在增强对象中存在,则使用增强版本\r\n return Reflect.get(\r\n hasOwn(instrumentations, key) && key in target\r\n ? instrumentations\r\n : target,\r\n key,\r\n receiver,\r\n );\r\n };\r\n}\r\n\r\n/**\r\n * 集合方法增强类型。\r\n *\r\n * 定义了所有需要增强的集合方法的类型。\r\n */\r\ntype Instrumentations = Record<string | symbol, Function | number>;\r\n\r\n/**\r\n * 创建集合方法的增强实现。\r\n *\r\n * 为集合类型(Map、Set、WeakMap、WeakSet)创建响应式增强方法:\r\n * 1. 基本操作:get、set、has、delete、clear\r\n * 2. 遍历操作:forEach、keys、values、entries\r\n * 3. 大小获取:size\r\n *\r\n * @returns 增强后的集合方法对象\r\n */\r\nfunction createInstrumentations(): Instrumentations\r\n{\r\n const instrumentations: Instrumentations = {\r\n /**\r\n * 获取 Map 中的值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 支持原始键和响应式键的查找\r\n * 2. 自动追踪键的访问\r\n * 3. 自动将返回值转换为响应式\r\n *\r\n * @param key 要查找的键\r\n * @returns 找到的值,如果不存在则返回 undefined\r\n */\r\n get(this: MapTypes, key: unknown)\r\n {\r\n // #1772: readonly(reactive(Map)) 应该返回只读的响应式值\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const rawKey = toRaw(key);\r\n\r\n // 追踪键的访问\r\n if (hasChanged(key, rawKey))\r\n {\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, key);\r\n }\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, rawKey);\r\n\r\n const { has } = getProto(rawTarget);\r\n const wrap = toReactive;\r\n\r\n if (has.call(rawTarget, key))\r\n {\r\n return wrap(target.get(key));\r\n }\r\n else if (has.call(rawTarget, rawKey))\r\n {\r\n return wrap(target.get(rawKey));\r\n }\r\n else if (target !== rawTarget)\r\n {\r\n // #3602 readonly(reactive(Map))\r\n // 确保嵌套的响应式 Map 可以追踪自身\r\n target.get(key);\r\n }\r\n },\r\n\r\n /**\r\n * 获取集合的大小。\r\n *\r\n * 实现了以下功能:\r\n * 1. 追踪集合大小的访问\r\n * 2. 返回集合的实际大小\r\n */\r\n get size()\r\n {\r\n const target = (this as unknown as IterableCollections)[ReactiveFlags.RAW];\r\n\r\n PropertyReactivity.track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY);\r\n\r\n return Reflect.get(target, 'size', target);\r\n },\r\n\r\n /**\r\n * 检查集合是否包含某个值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 支持原始键和响应式键的检查\r\n * 2. 自动追踪键的检查\r\n *\r\n * @param key 要检查的键\r\n * @returns 如果集合包含该键则返回 true,否则返回 false\r\n */\r\n has(this: CollectionTypes, key: unknown): boolean\r\n {\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const rawKey = toRaw(key);\r\n\r\n // 追踪键的检查\r\n if (hasChanged(key, rawKey))\r\n {\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, key);\r\n }\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, rawKey);\r\n\r\n return key === rawKey\r\n ? target.has(key)\r\n : target.has(key) || target.has(rawKey);\r\n },\r\n\r\n /**\r\n * 遍历集合中的所有元素。\r\n *\r\n * 实现了以下功能:\r\n * 1. 追踪集合的遍历操作\r\n * 2. 自动将遍历的值转换为响应式\r\n * 3. 保持回调函数的 this 上下文\r\n *\r\n * @param callback 遍历回调函数\r\n * @param thisArg 回调函数的 this 值\r\n */\r\n forEach(this: IterableCollections, callback: Function, thisArg?: unknown)\r\n {\r\n const observed = this;\r\n const target = observed[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const wrap = toReactive;\r\n\r\n PropertyReactivity.track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY);\r\n\r\n return target.forEach((value: unknown, key: unknown) =>\r\n // 重要:确保回调函数\r\n // 1. 使用响应式 map 作为 this 和第三个参数\r\n // 2. 接收到的值应该是相应的响应式/只读版本\r\n callback.call(thisArg, wrap(value), wrap(key), observed),\r\n );\r\n },\r\n\r\n /**\r\n * 向 Set 中添加值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 自动将值转换为原始值\r\n * 2. 避免重复添加\r\n * 3. 触发添加操作的通知\r\n *\r\n * @param value 要添加的值\r\n * @returns 集合本身,支持链式调用\r\n */\r\n add(this: SetTypes, value: unknown)\r\n {\r\n value = toRaw(value);\r\n const target = toRaw(this);\r\n const proto = getProto(target);\r\n const hadKey = proto.has.call(target, value);\r\n\r\n if (!hadKey)\r\n {\r\n target.add(value);\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, value, value);\r\n }\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * 设置 Map 中的值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 自动将值转换为原始值\r\n * 2. 支持原始键和响应式键的设置\r\n * 3. 触发添加或修改操作的通知\r\n *\r\n * @param key 要设置的键\r\n * @param value 要设置的值\r\n * @returns 集合本身,支持链式调用\r\n */\r\n set(this: MapTypes, key: unknown, value: unknown)\r\n {\r\n value = toRaw(value);\r\n const target = toRaw(this);\r\n const { has, get } = getProto(target);\r\n\r\n let hadKey = has.call(target, key);\r\n\r\n if (!hadKey)\r\n {\r\n key = toRaw(key);\r\n hadKey = has.call(target, key);\r\n }\r\n else if (__DEV__)\r\n {\r\n checkIdentityKeys(target, has, key);\r\n }\r\n\r\n const oldValue = get.call(target, key);\r\n\r\n target.set(key, value);\r\n if (!hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\r\n }\r\n else if (hasChanged(value, oldValue))\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\r\n }\r\n\r\n return this;\r\n },\r\n\r\n /**\r\n * 从集合中删除值。\r\n *\r\n * 实现了以下功能:\r\n * 1. 支持原始键和响应式键的删除\r\n * 2. 触发删除操作的通知\r\n *\r\n * @param key 要删除的键\r\n * @returns 如果删除成功则返回 true,否则返回 false\r\n */\r\n delete(this: CollectionTypes, key: unknown)\r\n {\r\n const target = toRaw(this);\r\n const { has, get } = getProto(target);\r\n let hadKey = has.call(target, key);\r\n\r\n if (!hadKey)\r\n {\r\n key = toRaw(key);\r\n hadKey = has.call(target, key);\r\n }\r\n else if (__DEV__)\r\n {\r\n checkIdentityKeys(target, has, key);\r\n }\r\n\r\n const oldValue = get ? get.call(target, key) : undefined;\r\n // 在触发反应之前执行操作\r\n const result = target.delete(key);\r\n\r\n if (hadKey)\r\n {\r\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\r\n }\r\n\r\n return result;\r\n },\r\n\r\n /**\r\n * 清空集合。\r\n *\r\n * 实现了以下功能:\r\n * 1. 清空集合中的所有元素\r\n * 2. 触发清空操作的通知\r\n * 3. 在开发模式下保存旧值用于调试\r\n *\r\n * @returns 如果清空成功则返回 true,否则返回 false\r\n */\r\n clear(this: IterableCollections)\r\n {\r\n const target = toRaw(this);\r\n const hadItems = target.size !== 0;\r\n const oldTarget = __DEV__\r\n ? isMap(target)\r\n ? new Map(target)\r\n : new Set(target)\r\n : undefined;\r\n // 在触发反应之前执行操作\r\n const result = target.clear();\r\n\r\n if (hadItems)\r\n {\r\n PropertyReactivity.trigger(\r\n target,\r\n TriggerOpTypes.CLEAR,\r\n undefined,\r\n undefined,\r\n oldTarget,\r\n );\r\n }\r\n\r\n return result;\r\n },\r\n };\r\n\r\n // 添加迭代器方法\r\n const iteratorMethods = [\r\n 'keys',\r\n 'values',\r\n 'entries',\r\n Symbol.iterator,\r\n ] as const;\r\n\r\n iteratorMethods.forEach((method) =>\r\n {\r\n instrumentations[method] = createIterableMethod(method);\r\n });\r\n\r\n return instrumentations;\r\n}\r\n\r\n/**\r\n * 创建迭代器方法。\r\n *\r\n * 为集合创建响应式的迭代器方法,包括:\r\n * 1. keys() - 返回键的迭代器\r\n * 2. values() - 返回值的迭代器\r\n * 3. entries() - 返回键值对的迭代器\r\n * 4. [Symbol.iterator] - 返回默认迭代器\r\n *\r\n * @param method 迭代器方法名\r\n * @returns 增强后的迭代器方法\r\n */\r\nfunction createIterableMethod(method: string | symbol)\r\n{\r\n return function (\r\n this: IterableCollections,\r\n ...args: unknown[]\r\n ): Iterable<unknown> & Iterator<unknown>\r\n {\r\n const target = this[ReactiveFlags.RAW];\r\n const rawTarget = toRaw(target);\r\n const targetIsMap = isMap(rawTarget);\r\n const isPair\r\n = method === 'entries' || (method === Symbol.iterator && targetIsMap);\r\n const isKeyOnly = method === 'keys' && targetIsMap;\r\n const innerIterator = target[method](...args);\r\n const wrap = toReactive;\r\n\r\n // 追踪迭代操作\r\n PropertyReactivity.track(\r\n rawTarget,\r\n TrackOpTypes.ITERATE,\r\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY,\r\n );\r\n\r\n // 返回一个包装的迭代器,它会返回响应式版本的值\r\n return {\r\n // 迭代器协议\r\n next()\r\n {\r\n const { value, done } = innerIterator.next();\r\n\r\n return done\r\n ? { value, done }\r\n : {\r\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\r\n done,\r\n };\r\n },\r\n // 可迭代协议\r\n [Symbol.iterator]()\r\n {\r\n return this;\r\n },\r\n };\r\n };\r\n}\r\n\r\n/**\r\n * 检查键的身份。\r\n *\r\n * 在开发模式下检查键的身份,确保不会出现重复的键。\r\n *\r\n * @param target 目标集合\r\n * @param has 检查方法\r\n * @param key 要检查的键\r\n */\r\nfunction checkIdentityKeys(\r\n target: CollectionTypes,\r\n has: (key: unknown) => boolean,\r\n key: unknown,\r\n)\r\n{\r\n const rawKey = toRaw(key);\r\n\r\n if (rawKey !== key && has.call(target, rawKey))\r\n {\r\n const type = toRawType(target);\r\n\r\n warn(\r\n `Reactive ${type} contains both the raw and reactive ` +\r\n `versions of the same object${type === `Map` ? ` as keys` : ``}, ` +\r\n `which can lead to inconsistencies. ` +\r\n `It is recommended to use only the reactive version.`,\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * 获取对象的原型。\r\n *\r\n * @param v 目标对象\r\n * @returns 对象的原型\r\n */\r\nconst getProto = <T extends CollectionTypes>(v: T): any => Reflect.getPrototypeOf(v);\r\n\r\n/**\r\n * 集合类型。\r\n *\r\n * 包括可迭代集合和弱引用集合。\r\n */\r\ntype CollectionTypes = IterableCollections | WeakCollections;\r\n\r\n/**\r\n * 可迭代集合类型。\r\n *\r\n * 包括 Map 和 Set。\r\n */\r\ntype IterableCollections = (Map<any, any> | Set<any>) & Target;\r\n\r\n/**\r\n * 弱引用集合类型。\r\n *\r\n * 包括 WeakMap 和 WeakSet。\r\n */\r\ntype WeakCollections = (WeakMap<any, any> | WeakSet<any>) & Target;\r\n\r\n/**\r\n * Map 类型。\r\n *\r\n * 包括 Map 和 WeakMap。\r\n */\r\ntype MapTypes = (Map<any, any> | WeakMap<any, any>) & Target;\r\n\r\n/**\r\n * Set 类型。\r\n *\r\n * 包括 Set 和 WeakSet。\r\n */\r\ntype SetTypes = (Set<any> | WeakSet<any>) & Target;\r\n","import { mutableHandlers } from './baseHandlers';\r\nimport { mutableCollectionHandlers } from './collectionHandlers';\r\nimport { Computed } from './computed';\r\nimport { Ref } from './ref';\r\nimport { ReactiveFlags, TargetType } from './shared/constants';\r\nimport { getTargetType, isObject, Target } from './shared/general';\r\n\r\n/**\r\n * 移除对象属性中的 readonly 关键字。\r\n *\r\n * 用于将只读类型转换为可写类型。\r\n */\r\nexport type UnReadonly<T> = {\r\n -readonly [P in keyof T]: T[P];\r\n};\r\n\r\n/**\r\n * 创建或者获取响应式对象的代理对象。\r\n *\r\n * 将普通对象转换为响应式对象,使其属性可以被追踪和更新。\r\n *\r\n * 特点:\r\n * 1. 支持对象和集合类型的响应式转换\r\n * 2. 自动处理嵌套对象的响应式转换\r\n * 3. 缓存已创建的代理对象\r\n * 4. 支持只读属性的响应式转换\r\n *\r\n * 注意:\r\n * 1. 扩大被反应式的对象的类型范围,只有 `Object.isExtensible` 不通过的对象不被响应化。\r\n * Float32Array 等都允许被响应化。\r\n * 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,\r\n * 通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。\r\n *\r\n * @param target 要转换为响应式的对象\r\n * @returns 响应式代理对象\r\n */\r\nexport function reactive<T extends object>(target: T): Reactive<T>\r\n{\r\n if (!isObject(target))\r\n {\r\n return target;\r\n }\r\n\r\n if (target[ReactiveFlags.RAW])\r\n {\r\n return target as any;\r\n }\r\n\r\n // 只有特定类型的值可以被观察\r\n const targetType = getTargetType(target);\r\n\r\n if (targetType === TargetType.INVALID)\r\n {\r\n return target as any;\r\n }\r\n\r\n // 如果目标已经有对应的代理对象,直接返回\r\n const existingProxy = reactiveMap.get(target);\r\n\r\n if (existingProxy)\r\n {\r\n return existingProxy;\r\n }\r\n\r\n // 创建新的代理对象\r\n const proxy = new Proxy<T>(\r\n target,\r\n targetType === TargetType.COLLECTION ? mutableCollectionHandlers : mutableHandlers as any,\r\n ) as T;\r\n\r\n reactiveMap.set(target, proxy);\r\n\r\n return proxy as any;\r\n}\r\n\r\n/**\r\n * 响应式对象缓存映射。\r\n *\r\n * 用于缓存已创建的响应式代理对象,避免重复创建。\r\n */\r\nexport const reactiveMap = new WeakMap<Target, any>();\r\n\r\n/**\r\n * 判断一个对象是否为响应式对象。\r\n *\r\n * 通过检查对象是否具有 IS_REACTIVE 标志来判断。\r\n *\r\n * @param value 要检查的对象\r\n * @returns 如果是响应式对象则返回 true,否则返回 false\r\n */\r\nexport function isReactive(value: unknown): boolean\r\n{\r\n return !!(value && (value as Target)[ReactiveFlags.IS_REACTIVE]);\r\n}\r\n\r\n/**\r\n * 转换为响应式对象。\r\n *\r\n * 如果输入是对象,则将其转换为响应式对象。\r\n * 如果输入不是对象,则直接返回。\r\n *\r\n * @param value 要转换的值\r\n * @returns 转换后的响应式对象或原值\r\n */\r\nexport const toReactive = <T>(value: T): T =>\r\n{\r\n if (isObject(value))\r\n {\r\n return reactive(value as any) as any;\r\n }\r\n\r\n return value;\r\n};\r\n\r\n/**\r\n * 判断一个对象是否为代理对象。\r\n *\r\n * 通过检查对象是否具有 RAW 标志来判断。\r\n *\r\n * @param value 要检查的对象\r\n * @returns 如果是代理对象则返回 true,否则返回 false\r\n */\r\nexport function isProxy(value: any): boolean\r\n{\r\n return value ? !!value[ReactiveFlags.RAW] : false;\r\n}\r\n\r\n/**\r\n * 响应式类型。\r\n *\r\n * 表示一个对象的所有属性都是响应式的。\r\n */\r\nexport type Reactive<T> = UnReadonly<UnwrapRefSimple<T>>;\r\n\r\n/**\r\n * 原始类型。\r\n *\r\n * 包括:字符串、数字、布尔值、大整数、符号、undefined、null。\r\n */\r\ntype Primitive = string | number | boolean | bigint | symbol | undefined | null;\r\n\r\n/**\r\n * 内置类型。\r\n *\r\n * 包括:原始类型、函数、日期、错误、正则表达式。\r\n */\r\nexport type Builtin = Primitive | Function | Date | Error | RegExp;\r\n\r\n/**\r\n * 用于扩展不被解包的类型。\r\n *\r\n * 可以通过声明合并来扩展此接口,添加不需要被解包的类型。\r\n *\r\n * 示例:\r\n * ```ts\r\n * declare module '@vue/reactivity' {\r\n * export interface RefUnwrapBailTypes {\r\n * runtimeDOMBailTypes: Node | Window\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport interface RefUnwrapBailTypes { }\r\n\r\n/**\r\n * 解包类型。\r\n *\r\n * 递归地解包响应式对象的类型,包括:\r\n * 1. 内置类型直接返回\r\n * 2. Ref 类型解包为内部类型\r\n * 3. Computed 类型解包为内部类型\r\n * 4. 对象类型递归解包其属性\r\n * 5. 其他类型直接返回\r\n */\r\nexport type UnwrapRefSimple<T> =\r\n T extends\r\n | Builtin\r\n | Ref\r\n | RefUnwrapBailTypes[keyof RefUnwrapBailTypes]\r\n ? T :\r\n T extends Ref<infer TT> ? TT :\r\n T extends Computed<infer TT> ? TT :\r\n T extends object ? {\r\n [K in keyof T]: UnwrapRefSimple<T[K]>\r\n } :\r\n T;\r\n","import { Effect, effect, EffectScope } from '@feng3d/reactivity';\r\n\r\n/**\r\n * 响应式类基类\r\n *\r\n * 提供响应式编程的基础功能,包括:\r\n * 1. 提供副作用管理机制,自动管理副作用的生命周期\r\n * 2. 在类销毁时自动清理所有副作用,防止内存泄漏\r\n *\r\n * 使用方式:\r\n * ```typescript\r\n * class MyClass extends ReactiveObject {\r\n * constructor() {\r\n * super();\r\n *\r\n * // 创建副作用,会自动管理生命周期\r\n * this.effect(() => {\r\n * ...\r\n * });\r\n * }\r\n * }\r\n * ```\r\n */\r\nexport class ReactiveObject\r\n{\r\n constructor()\r\n {\r\n }\r\n\r\n /**\r\n * 副作用作用域\r\n *\r\n * 用于管理所有副作用的生命周期:\r\n * - 收集所有通过 effect() 方法创建的副作用\r\n * - 在类销毁时自动停止所有副作用\r\n * - 防止副作用在类销毁后继续执行,避免内存泄漏\r\n *\r\n * 私有属性,外部无法直接访问,只能通过 effect() 方法使用\r\n */\r\n private _effectScope = new EffectScope();\r\n\r\n /**\r\n * 销毁时需要执行的函数\r\n */\r\n private _destroyCallbacks: (() => void)[] = [];\r\n\r\n /**\r\n * 创建并运行副作用\r\n *\r\n * 功能:\r\n * 1. 将传入的函数包装为副作用\r\n * 2. 自动收集副作用中访问的响应式属性作为依赖\r\n * 3. 当依赖变化时自动重新执行副作用\r\n * 4. 在类销毁时自动停止副作用\r\n *\r\n * 使用场景:\r\n * - 监听属性变化并执行相应操作\r\n * - 自动更新UI或重新计算派生状态\r\n * - 执行清理或初始化逻辑\r\n *\r\n * @param fn 副作用函数,会在依赖变化时自动执行\r\n *\r\n * 使用示例:\r\n * ```typescript\r\n * this.effect(() => {\r\n * // 访问响应式属性,建立依赖关系\r\n * const value = reactive(this).someProperty;\r\n *\r\n * // 执行相应的逻辑\r\n * this.updateUI(value);\r\n * });\r\n * ```\r\n */\r\n effect(fn: () => void)\r\n {\r\n let eff: Effect;\r\n\r\n this._effectScope.run(() =>\r\n {\r\n eff = effect(fn);\r\n });\r\n\r\n return eff;\r\n }\r\n\r\n /**\r\n * 销毁时执行的函数\r\n * @param callback 销毁时执行的函数\r\n */\r\n destroyCall(callback: () => void)\r\n {\r\n this._destroyCallbacks.push(callback);\r\n }\r\n\r\n /**\r\n * 销毁响应式类实例\r\n *\r\n * 执行清理操作:\r\n * 1. 执行所有注册的清理函数\r\n * 2. 停止所有副作用作用域,防止副作用继续执行\r\n * 3. 清理引用,帮助垃圾回收,防止内存泄漏\r\n *\r\n * 重要:\r\n * - 子类重写此方法时必须调用 super.destroy()\r\n * - 确保在类实例不再使用时调用此方法\r\n * - 调用后实例将无法再使用 effect() 方法\r\n *\r\n * 使用示例:\r\n * ```typescript\r\n * class MyClass extends ReactiveObject {\r\n * destroy() {\r\n * // 执行子类特定的清理逻辑\r\n * this.cleanup();\r\n *\r\n * // 必须调用父类的destroy方法\r\n * super.destroy();\r\n * }\r\n * }\r\n * ```\r\n */\r\n destroy()\r\n {\r\n // 执行所有注册的清理函数\r\n this._destroyCallbacks?.forEach((item) => item());\r\n this._destroyCallbacks = null;\r\n\r\n // 停止副作用作用域,这会自动停止所有通过 effect() 创建的副作用\r\n this._effectScope?.stop();\r\n this._effectScope = null;\r\n }\r\n}"],"names":["ReactiveFlags","TargetType","TrackOpTypes","TriggerOpTypes","key","result","_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/Reactivity.ts","../src/batch.ts","../src/computed.ts","../src/shared/constants.ts","../src/shared/general.ts","../src/effectScope.ts","../src/effect.ts","../src/property.ts","../src/arrayInstrumentations.ts","../src/ref.ts","../src/baseHandlers.ts","../src/collectionHandlers.ts","../src/reactive.ts","../src/ReactiveObject.ts"],"sourcesContent":["import { type ComputedReactivity } from './computed';\n\n/**\n * 反应式节点基类。\n *\n * 拥有节点值以及被捕捉与触发的能力。\n * 用于被 computed、effect 等构建的节点所继承。\n *\n * 实现了响应式系统的核心功能:\n * 1. 值的存储和访问\n * 2. 依赖关系的建立(track)\n * 3. 变更通知的传播(trigger)\n */\nexport class Reactivity<T = any>\n{\n /**\n * 获取当前节点值。\n *\n * 取值时将会建立与父节点的依赖关系。\n * 当其他响应式节点访问此值时,会自动建立依赖关系。\n */\n get value(): T\n {\n this.track();\n\n return this._value;\n }\n\n /**\n * @private\n */\n _value: T;\n\n /**\n * 父反应节点集合。\n *\n * 记录了哪些节点依赖了当前节点。\n * 当当前节点值发生变化时,会通知所有父节点。\n *\n * Map 的 key 是父节点,value 是父节点的版本号。\n * 版本号用于判断依赖关系是否过期。\n *\n * @private\n */\n _parents = new Map<ComputedReactivity, number>();\n\n /**\n * 建立依赖关系。\n *\n * 当其他节点访问当前节点的值时,会调用此方法。\n * 将当前节点与访问者(父节点)建立依赖关系。\n *\n * 如果当前没有活动的响应式节点,或者不应该跟踪依赖,则不会建立依赖关系。\n */\n track()\n {\n if (!Reactivity.activeReactivity || !_shouldTrack) return;\n\n // 连接父节点和子节点。\n const parent = Reactivity.activeReactivity;\n\n if (parent)\n {\n this._parents.set(parent, parent._version);\n }\n }\n\n /**\n * 触发更新。\n *\n * 当节点值发生变化时,会调用此方法。\n * 通知所有依赖此节点的父节点进行更新。\n *\n * 更新过程:\n * 1. 遍历所有父节点\n * 2. 检查父节点的版本号是否匹配\n * 3. 触发父节点的更新\n * 4. 将当前节点添加到父节点的失效子节点集合中\n */\n trigger()\n {\n // 冒泡到所有父节点,设置失效子节点字典。\n this._parents.forEach((version, parent) =>\n {\n if (parent._version !== version) return;\n\n parent.trigger();\n // 失效时添加子节点到父节点中。\n parent._children.set(this, this._value);\n });\n\n //\n this._parents.clear();\n }\n\n /**\n * 当前正在执行的反应式节点。\n *\n * 用于在依赖收集过程中标识当前正在执行的节点。\n * 当其他节点访问此节点的值时,会将其作为父节点。\n *\n * @internal\n */\n static activeReactivity: ComputedReactivity;\n}\n\n/**\n * 反应式节点链。\n *\n * 用于表示响应式节点之间的依赖关系链。\n * 每个节点包含:\n * 1. 节点本身\n * 2. 节点的值\n * 3. 下一个节点的引用\n */\nexport type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };\n\n/**\n * 强制跟踪依赖。\n *\n * 在函数执行期间强制启用依赖跟踪。\n * 即使当前处于不跟踪状态,也会建立依赖关系。\n *\n * @param fn 要执行的函数\n * @returns 函数的执行结果\n */\nexport function forceTrack<T>(fn: () => T): T\n{\n const preShouldTrack = _shouldTrack;\n\n _shouldTrack = true;\n const result = fn();\n\n _shouldTrack = preShouldTrack;\n\n return result;\n}\n\n/**\n * 禁用依赖跟踪。\n *\n * 在函数执行期间禁用依赖跟踪。\n * 即使当前处于跟踪状态,也不会建立依赖关系。\n *\n * @param fn 要执行的函数\n * @returns 函数的执行结果\n */\nexport function noTrack<T>(fn: () => T): T\n{\n const preShouldTrack = _shouldTrack;\n\n _shouldTrack = false;\n const result = fn();\n\n _shouldTrack = preShouldTrack;\n\n return result;\n}\n\n/**\n * 是否应该跟踪依赖的标志。\n *\n * 控制是否进行依赖跟踪。\n * 可以通过 forceTrack 和 noTrack 函数临时修改此值。\n *\n * @private\n */\nlet _shouldTrack = true;\n","import { ComputedReactivity } from './computed';\nimport { Reactivity } from './Reactivity';\n\n/**\n * 合批处理依赖。\n *\n * 将依赖添加到待处理队列中,根据依赖的运行状态决定处理方式:\n * 1. 如果依赖正在运行,添加到已运行队列\n * 2. 如果依赖未运行,添加到待运行队列\n *\n * @param dep 要处理的依赖\n * @param isRunning 依赖是否正在运行\n */\nexport function batch(dep: ComputedReactivity, isRunning: boolean): void\n{\n if (isRunning)\n {\n // 如果依赖已经在队列中,直接返回,避免重复添加\n if (_isRunedDeps.indexOf(dep) !== -1)\n {\n return;\n }\n\n _isRunedDeps.push(dep);\n }\n else\n {\n // 如果依赖已经在队列中,直接返回,避免重复添加\n if (_needEffectDeps.indexOf(dep) !== -1)\n {\n return;\n }\n\n _needEffectDeps.push(dep);\n }\n}\n\n/**\n * 批次执行多次修改反应式对象。\n *\n * 将多个响应式更新合并为一个批次执行,可以减少不必要的反应式触发。\n * 在批次执行期间:\n * 1. 所有响应式更新都会被收集\n * 2. 批次结束后统一处理所有更新\n * 3. 避免中间状态触发不必要的更新\n *\n * 示例:\n * ```ts\n * batchRun(() => {\n * // 修改反应式对象\n * reactiveObj.a = 1;\n * reactiveObj.b = 2;\n * })\n * ```\n *\n * @param fn 要执行的函数,在此函数中多次修改反应式对象\n * @returns 函数的执行结果\n */\nexport function batchRun<T>(fn: () => T): T\n{\n _batchDepth++;\n\n const result = fn();\n\n if (--_batchDepth > 0)\n {\n return;\n }\n\n // 处理已经运行过的依赖\n if (_isRunedDeps.length > 0)\n {\n _isRunedDeps.forEach((dep) =>\n {\n // 此时依赖以及子依赖都已经运行过了,只需修复与子节点关系\n __DEV__ && console.assert(dep._isDirty === false, 'dep.dirty === false');\n\n // 修复与子节点关系\n dep._children.forEach((version, node) =>\n {\n node._parents.set(dep, dep._version);\n });\n dep._children.clear();\n });\n _isRunedDeps.length = 0;\n }\n\n // 批次处理待运行的依赖\n if (_needEffectDeps.length > 0)\n {\n _needEffectDeps.forEach((dep) =>\n {\n // 独立执行回调,避免影响其他依赖\n const pre = Reactivity.activeReactivity;\n\n Reactivity.activeReactivity = null;\n\n dep.runIfDirty();\n\n Reactivity.activeReactivity = pre;\n });\n _needEffectDeps.length = 0;\n }\n\n return result;\n}\n\n/**\n * 批次深度。\n *\n * 用于跟踪嵌套的批次执行。\n * 当深度大于 0 时,表示当前正在批次执行中。\n */\nlet _batchDepth = 0;\n\n/**\n * 待运行的依赖队列。\n *\n * 存储需要执行但尚未执行的依赖。\n * 在批次执行结束后,会统一处理这些依赖。\n */\nconst _needEffectDeps: ComputedReactivity[] = [];\n\n/**\n * 已运行的依赖队列。\n *\n * 存储已经执行过的依赖。\n * 这些依赖只需要修复与子节点的关系,不需要重新执行。\n */\nconst _isRunedDeps: ComputedReactivity[] = [];\n","import { batch } from './batch';\nimport { Reactivity, forceTrack } from './Reactivity';\n\n/**\n * 创建计算反应式对象。\n *\n * 计算属性会缓存计算结果,只有当依赖发生变化时才会重新计算。\n *\n * @param func 计算函数,可以访问其他响应式数据,并返回计算结果\n * @returns 包含 value 属性的计算属性对象\n */\nexport function computed<T>(func: (oldValue?: T) => T): Computed<T>\n{\n return new ComputedReactivity(func) as any;\n}\n\n/**\n * 计算属性接口。\n *\n * 定义了计算属性的基本结构:\n * 1. value: 计算属性的当前值\n * 2. ComputedSymbol: 用于标识这是一个计算属性\n */\nexport interface Computed<T = any>\n{\n readonly value: T\n [ComputedSymbol]: true\n}\ndeclare const ComputedSymbol: unique symbol;\n\n/**\n * 计算反应式节点接口。\n *\n * 继承自 Computed 接口,表示这是一个计算反应式节点。\n */\nexport interface ComputedReactivity<T = any> extends Computed<T> { }\n\n/**\n * 计算反应式节点类。\n *\n * 当使用 computed 函数时,会创建一个 ComputedReactivity 对象。\n * 实现了计算属性的核心功能:\n * 1. 缓存计算结果\n * 2. 按需重新计算\n * 3. 依赖追踪\n * 4. 变更通知\n */\nexport class ComputedReactivity<T = any> extends Reactivity<T>\n{\n /**\n * 标识这是一个 ref 对象。\n *\n * @internal\n */\n readonly __v_isRef = true;\n\n /**\n * 计算函数。\n *\n * 用于计算属性值的函数,可以访问其他响应式数据。\n * 当依赖发生变化时,会重新执行此函数。\n */\n protected _func: (oldValue?: T) => T;\n\n /**\n * 失效子节点集合。\n *\n * 记录所有依赖此计算属性的子节点。\n * 当计算属性重新计算时,会通知这些子节点。\n *\n * @private\n */\n _children = new Map<Reactivity, any>();\n\n /**\n * 脏标记。\n *\n * 表示计算属性是否需要重新计算。\n * 当依赖发生变化时,会设置此标记。\n * 重新计算后会清除此标记。\n *\n * @private\n */\n _isDirty = true;\n\n /**\n * 版本号。\n *\n * 每次重新计算后自动递增。\n * 用于判断子节点中的父节点引用是否过期。\n * 当子节点发现父节点的版本号不匹配时,会重新建立依赖关系。\n *\n * @private\n */\n _version = -1;\n\n /**\n * 获取计算属性的值。\n *\n * 取值时会:\n * 1. 检查是否需要重新计算\n * 2. 建立与父节点的依赖关系\n * 3. 返回当前值\n */\n get value(): T\n {\n this.runIfDirty();\n this.track();\n\n return this._value;\n }\n\n /**\n * 创建计算反应式节点。\n *\n * @param func 计算函数,可以访问其他响应式数据,并返回计算结果\n */\n constructor(func: (oldValue?: T) => T)\n {\n super();\n this._func = func;\n }\n\n /**\n * 触发更新。\n *\n * 当依赖发生变化时,会调用此方法。\n * 如果当前正在执行计算,会将更新延迟到计算完成后。\n * 否则,立即通知所有父节点进行更新。\n */\n trigger(): void\n {\n // 正在运行时被触发,需要在运行结束后修复父子节点关系\n if (Reactivity.activeReactivity === this)\n {\n batch(this, Reactivity.activeReactivity === this);\n }\n\n super.trigger();\n }\n\n /**\n * 执行计算。\n *\n * 执行计算函数,更新当前值。\n * 在计算过程中会:\n * 1. 强制启用依赖跟踪\n * 2. 保存并设置当前活动节点\n * 3. 执行计算函数\n * 4. 恢复活动节点\n */\n run()\n {\n // 不受嵌套的 effect 影响\n forceTrack(() =>\n {\n // 保存当前节点作为父节点\n const parentReactiveNode = Reactivity.activeReactivity;\n\n // 设置当前节点为活跃节点\n Reactivity.activeReactivity = this as any;\n\n this._version++;\n this._value = this._func(this._value);\n\n // 执行完毕后恢复父节点\n Reactivity.activeReactivity = parentReactiveNode;\n });\n }\n\n /**\n * 检查并执行计算。\n *\n * 检查当前节点是否需要重新计算:\n * 1. 如果脏标记为 true,需要重新计算\n * 2. 如果子节点发生变化,需要重新计算\n *\n * 重新计算后会清除脏标记。\n */\n runIfDirty()\n {\n // 检查是否存在失效子节点字典\n this._isDirty = this._isDirty || this.isChildrenChanged();\n\n // 标记为脏的情况下,执行计算\n if (this._isDirty)\n {\n // 立即去除脏标记,避免循环多重计算\n this._isDirty = false;\n\n // 执行计算\n this.run();\n }\n }\n\n /**\n * 检查子节点是否发生变化。\n *\n * 遍历所有子节点,检查它们的值是否发生变化。\n * 如果发生变化,返回 true,否则返回 false。\n *\n * 在检查过程中会:\n * 1. 临时禁用依赖跟踪\n * 2. 检查每个子节点的值\n * 3. 如果子节点没有变化,重新建立依赖关系\n * 4. 清空子节点集合\n *\n * @returns 是否有子节点发生变化\n */\n protected isChildrenChanged()\n {\n if (this._children.size === 0) return false;\n\n // 检查是否存在子节点发生变化\n let isChanged = false;\n\n // 避免在检查过程建立依赖关系\n const preReactiveNode = Reactivity.activeReactivity;\n\n Reactivity.activeReactivity = null;\n\n // 检查子节点是否发生变化\n this._children.forEach((value, node) =>\n {\n if (isChanged) return;\n if (node.value !== value)\n {\n // 子节点变化,需要重新计算\n isChanged = true;\n\n return;\n }\n });\n\n // 恢复父节点\n Reactivity.activeReactivity = preReactiveNode;\n\n if (!isChanged)\n {\n // 修复与子节点关系\n this._children.forEach((version, node) =>\n {\n node._parents.set(this, this._version);\n });\n }\n\n // 清空子节点\n this._children.clear();\n\n return isChanged;\n }\n}\n\n","/**\n * 响应式标志枚举,用于标识响应式对象的特殊属性或状态\n */\nexport enum ReactiveFlags\n{\n IS_REACTIVE = '__v_isReactive', // 标识对象是否为响应式对象\n RAW = '__v_raw', // 获取对象的原始非响应式版本\n IS_REF = '__v_isRef', // 标识对象是否为 ref 对象\n}\n\nexport enum TargetType\n{\n INVALID = 0,\n COMMON = 1,\n COLLECTION = 2,\n}\n\n/**\n * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型\n */\nexport enum TrackOpTypes\n{\n GET = 'get', // 获取属性值\n HAS = 'has', // 检查属性是否存在\n ITERATE = 'iterate', // 遍历对象属性\n}\n\n/**\n * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型\n */\nexport enum TriggerOpTypes\n{\n SET = 'set', // 设置属性值\n ADD = 'add', // 添加新属性\n DELETE = 'delete', // 删除属性\n CLEAR = 'clear', // 清空对象属性\n}\n\nexport const ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Object iterate' : '');\nexport const MAP_KEY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Map keys iterate' : '');\nexport const ARRAY_ITERATE_KEY: unique symbol = Symbol(__DEV__ ? 'Array iterate' : '');\n","/* eslint-disable no-var */\nimport { ReactiveFlags, TargetType } from './constants';\n\nexport { };\ndeclare global\n{\n /**\n * 是否为开发模式。\n */\n var __DEV__: boolean;\n}\nglobalThis.__DEV__ ??= true;\n\nexport const isObject = (val: unknown): val is Record<any, any> => val !== null && typeof val === 'object';\n// 判断是否为数组\nexport const isArray: typeof Array.isArray = Array.isArray;\nexport const isSymbol = (val: unknown): val is symbol => typeof val === 'symbol';\nexport const isString = (val: unknown): val is string => typeof val === 'string';\nexport const isIntegerKey = (key: unknown): boolean =>\n isString(key)\n && key !== 'NaN'\n && key[0] !== '-'\n && `${parseInt(key as any, 10)}` === key;\nexport const isMap = (val: unknown): val is Map<any, any> =>\n toTypeString(val) === '[object Map]';\n\n// 判断对象是否拥有指定属性\nexport const hasOwn = (\n val: object,\n key: string | symbol,\n): key is keyof typeof val => Object.prototype.hasOwnProperty.call(val, key);\n\n// 比较两个值是否发生变化,考虑 NaN 的情况\nexport const hasChanged = (value: any, oldValue: any): boolean =>\n !Object.is(value, oldValue);\n\nfunction targetTypeMap(rawType: string)\n{\n switch (rawType)\n {\n case 'Object':\n case 'Array':\n return TargetType.COMMON;\n case 'Map':\n case 'Set':\n case 'WeakMap':\n case 'WeakSet':\n return TargetType.COLLECTION;\n default:\n return TargetType.COMMON;\n }\n}\n\nexport function getTargetType(value: Target)\n{\n if (!Object.isExtensible(value)) return TargetType.INVALID;\n\n return targetTypeMap(toRawType(value));\n}\n\nconst toTypeString = (value: unknown): string => Object.prototype.toString.call(value);\n\n// 获取值的原始类型\nexport const toRawType = (value: unknown): string =>\n\n // 从类似 \"[object RawType]\" 的字符串中提取 \"RawType\"\n toTypeString(value).slice(8, -1);\n\nexport interface Target\n{\n [ReactiveFlags.IS_REACTIVE]?: boolean\n [ReactiveFlags.RAW]?: any\n}\n\n/**\n * 将一个响应式对象转换为原始对象。\n * @param observed 响应式对象。\n * @returns 原始对象。\n */\nexport function toRaw<T>(observed: T): T\n{\n const raw = observed && (observed as Target)[ReactiveFlags.RAW];\n\n return raw ? toRaw(raw) : observed;\n}\n\nexport function warn(msg: string, ...args: any[]): void\n{\n console.warn(`[警告] ${msg}`, ...args);\n}\n\n/**\n * 创建一个映射,并返回一个用于检查键是否存在于该映射中的函数。\n * 重要提示:所有调用此函数的地方都必须以 \\/\\*#\\_\\_PURE\\_\\_\\*\\/ 作为前缀,\n * 以便在必要时 Rollup 可以进行 tree-shaking。\n */\n\n/* ! #__NO_SIDE_EFFECTS__ */\nexport function makeMap(str: string): (key: string) => boolean\n{\n // 创建一个空对象作为映射,使用 Object.create(null) 避免原型链上的属性干扰\n const map = Object.create(null);\n\n // 将输入的字符串按逗号分隔,遍历每个键并将其添加到映射中,值为 1\n for (const key of str.split(',')) map[key] = 1;\n\n // 返回一个函数,该函数接受一个键值,并检查该键是否存在于映射中\n return (val) => val in map;\n}\n","import type { Effect as ReactiveEffect } from './effect';\nimport { warn } from './shared/general';\n\n/**\n * 当前活动的效果作用域\n */\nexport let activeEffectScope: EffectScope | undefined;\n\n/**\n * 效果作用域类\n *\n * 用于管理一组相关的响应式效果,可以统一控制它们的生命周期。\n */\nexport class EffectScope\n{\n /**\n * 作用域是否处于活动状态\n * @internal\n */\n private _active = true;\n /**\n * 跟踪 on 方法的调用次数,允许多次调用 on 方法\n * @internal\n */\n private _on = 0;\n /**\n * 存储当前作用域中的所有效果\n * @internal\n */\n effects: ReactiveEffect[] = [];\n /**\n * 存储清理函数\n * @internal\n */\n cleanups: (() => void)[] = [];\n\n /**\n * 作用域是否被暂停\n */\n private _isPaused = false;\n\n /**\n * 父作用域,仅由非分离的作用域分配\n * @internal\n */\n parent: EffectScope | undefined;\n /**\n * 记录未分离的子作用域\n * @internal\n */\n scopes: EffectScope[] | undefined;\n /**\n * 在父作用域的 scopes 数组中记录子作用域的索引,用于优化移除操作\n * @internal\n */\n private index: number | undefined;\n\n /**\n * 构造函数\n * @param detached 是否创建分离的作用域\n */\n constructor(public detached = false)\n {\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope)\n {\n this.index =\n (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this,\n ) - 1;\n }\n }\n\n /**\n * 获取作用域是否处于活动状态\n */\n get active(): boolean\n {\n return this._active;\n }\n\n /**\n * 暂停作用域\n *\n * 暂停当前作用域及其所有子作用域和效果\n */\n pause(): void\n {\n if (this._active)\n {\n this._isPaused = true;\n let i: number, l: number;\n\n if (this.scopes)\n {\n for (i = 0, l = this.scopes.length; i < l; i++)\n {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++)\n {\n this.effects[i].pause();\n }\n }\n }\n\n /**\n * 恢复作用域\n *\n * 恢复当前作用域及其所有子作用域和效果\n */\n resume(): void\n {\n if (this._active)\n {\n if (this._isPaused)\n {\n this._isPaused = false;\n let i: number, l: number;\n\n if (this.scopes)\n {\n for (i = 0, l = this.scopes.length; i < l; i++)\n {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++)\n {\n this.effects[i].resume();\n }\n }\n }\n }\n\n /**\n * 在作用域中运行函数\n * @param fn 要运行的函数\n * @returns 函数的返回值\n */\n run<T>(fn: () => T): T | undefined\n {\n if (this._active)\n {\n const currentEffectScope = activeEffectScope;\n\n try\n {\n activeEffectScope = this;\n\n return fn();\n }\n finally\n {\n activeEffectScope = currentEffectScope;\n }\n }\n else if (__DEV__)\n {\n warn(`无法运行已停用的 effect 作用域。`);\n }\n }\n\n /**\n * 前一个作用域\n */\n prevScope: EffectScope | undefined;\n /**\n * 激活作用域\n * 仅应在非分离的作用域上调用\n * @internal\n */\n on(): void\n {\n if (++this._on === 1)\n {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n\n /**\n * 停用作用域\n * 仅应在非分离的作用域上调用\n * @internal\n */\n off(): void\n {\n if (this._on > 0 && --this._on === 0)\n {\n activeEffectScope = this.prevScope;\n this.prevScope = undefined;\n }\n }\n\n /**\n * 停止作用域\n *\n * 停止当前作用域及其所有子作用域和效果,并执行清理函数\n * @param fromParent 是否由父作用域调用\n */\n stop(fromParent?: boolean): void\n {\n if (this._active)\n {\n this._active = false;\n let i: number, l: number;\n\n for (i = 0, l = this.effects.length; i < l; i++)\n {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n\n for (i = 0, l = this.cleanups.length; i < l; i++)\n {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n\n if (this.scopes)\n {\n for (i = 0, l = this.scopes.length; i < l; i++)\n {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n\n // 嵌套作用域,从父作用域中解除引用以避免内存泄漏\n if (!this.detached && this.parent && !fromParent)\n {\n // 优化的 O(1) 移除\n const last = this.parent.scopes!.pop();\n\n if (last && last !== this)\n {\n this.parent.scopes![this.index!] = last;\n last.index = this.index!;\n }\n }\n this.parent = undefined;\n }\n }\n}\n\n/**\n * 创建效果作用域对象\n *\n * 可以捕获在其中创建的响应式效果(即计算属性和观察者),以便这些效果可以一起处理。\n *\n * @param detached 是否创建分离的作用域\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#effectscope}\n */\nexport function effectScope(detached?: boolean): EffectScope\n{\n return new EffectScope(detached);\n}\n\n/**\n * 获取当前活动的效果作用域\n *\n * @returns 当前活动的效果作用域,如果没有则返回 undefined\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#getcurrentscope}\n */\nexport function getCurrentScope(): EffectScope | undefined\n{\n return activeEffectScope;\n}\n\n/**\n * 在当前活动的效果作用域上注册清理回调\n *\n * 当关联的效果作用域停止时,将调用此回调函数。\n *\n * @param fn 要附加到作用域清理的回调函数\n * @param failSilently 是否静默失败\n * @see {@link https://vuejs.org/api/reactivity-advanced.html#onscopedispose}\n */\nexport function onScopeDispose(fn: () => void, failSilently = false): void\n{\n if (activeEffectScope)\n {\n activeEffectScope.cleanups.push(fn);\n }\n else if (__DEV__ && !failSilently)\n {\n warn(\n `onScopeDispose() 在没有活动的 effect 作用域时被调用,无法关联。`,\n );\n }\n}\n","import { batch, batchRun } from './batch';\nimport { ComputedReactivity } from './computed';\nimport { activeEffectScope } from './effectScope';\nimport { Reactivity } from './Reactivity';\n\n/**\n * 创建效果反应式节点。\n *\n * 将会维持反应式效果,当被作用的函数所引用的响应式对象发生变化时,会立即执行 fn 函数。\n *\n * @param fn 要执行的函数\n * @returns 暂停和恢复副作用的函数\n *\n * 注:\n * 1. 与 `@vue/reactivity` 中的 effect 不同,此函数返回的是一个 Effect 对象,而不是一个函数。\n * 2. 不希望用户直接执行,而是通过反应式自动触发。\n * 3. 真有需求,可以使用 effect(func).run(true) 来代替 @vue/reactivity 中的 effect(func)() 。\n *\n */\nexport function effect<T = any>(fn: () => T): Effect\n{\n return new EffectReactivity(fn);\n}\n\n/**\n * 效果反应式节点。\n */\nexport class EffectReactivity<T = any> extends ComputedReactivity<T> implements Effect\n{\n /**\n * 是否为启用, 默认为 true。\n *\n * 启用时,会立即执行函数。\n */\n private _isEnable = true;\n\n constructor(func: (oldValue?: T) => T)\n {\n super(func);\n if (activeEffectScope && activeEffectScope.active)\n {\n activeEffectScope.effects.push(this);\n }\n this.runIfDirty();\n }\n\n /**\n * 暂停效果。\n *\n * 暂停后,当依赖发生变化时不会自动执行。\n */\n pause()\n {\n this._isEnable = false;\n }\n\n /**\n * 恢复效果。\n *\n * 恢复后,当依赖发生变化时会自动执行。\n */\n resume()\n {\n if (this._isEnable) return;\n this._isEnable = true;\n if (EffectReactivity.pausedQueueEffects.has(this))\n {\n EffectReactivity.pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n\n /**\n * 停止效果。\n *\n * 停止后,效果将不再响应依赖的变化。\n */\n stop()\n {\n this._isEnable = false;\n EffectReactivity.pausedQueueEffects.delete(this);\n }\n\n /**\n * 触发效果执行。\n *\n * 当依赖发生变化时,会调用此方法。\n */\n trigger()\n {\n batchRun(() =>\n {\n super.trigger();\n\n if (this._isEnable)\n {\n // 合批时需要判断是否已经运行的依赖。\n batch(this, Reactivity.activeReactivity === this);\n }\n else\n {\n EffectReactivity.pausedQueueEffects.add(this);\n }\n });\n }\n\n private static pausedQueueEffects = new WeakSet<EffectReactivity>();\n\n /**\n * 执行当前节点。\n *\n * 当暂停时将会直接执行被包装的函数。\n */\n run(): void\n {\n if (this._isEnable)\n {\n super.run();\n }\n else\n {\n this._func(this._value);\n }\n }\n}\n\n/**\n * 维持反应式效果。\n */\nexport interface Effect\n{\n /**\n * 暂停。\n */\n pause: () => void;\n\n /**\n * 恢复。\n */\n resume: () => void;\n\n /**\n * 停止。\n */\n stop: () => void;\n}\n","import { batchRun } from './batch';\nimport { Reactivity } from './Reactivity';\nimport { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';\n\n/**\n * 反应式属性。\n *\n * @param target 对象。\n * @param key 属性\n * @returns 反应式属性。\n */\nfunction property<T, K extends keyof T>(target: T, key: K)\n{\n let depsMap = PropertyReactivity._targetMap.get(target);\n\n if (!depsMap)\n {\n depsMap = new Map();\n PropertyReactivity._targetMap.set(target, depsMap);\n }\n\n //\n let dep = depsMap.get(key);\n\n if (!dep)\n {\n dep = new PropertyReactivity(target, key);\n depsMap.set(key, dep);\n }\n\n return dep;\n}\n\n/**\n * 属性反应式节点。\n */\nexport class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>\n{\n /**\n * 获取当前节点值。\n *\n * 取值时将会建立与父节点的依赖关系。\n */\n get value(): T\n {\n this.track();\n\n return this._value;\n }\n\n set value(v)\n {\n // 处理特殊字段,这些字段\n if (this._key === 'length')\n {\n v = this._target['length'];\n }\n else if (isSymbol(this._key))\n {\n v = ~~this._value + 1 as any;\n }\n if (v === this._value) return;\n // 触发属性的变化。\n this.trigger();\n this._value = v;\n }\n\n private _target: T;\n private _key: K;\n\n constructor(target: T, key: K)\n {\n super();\n this._target = target;\n this._key = key;\n if (target instanceof Map\n || target instanceof WeakMap\n )\n {\n this._value = (target as any as WeakMap<any, any>).get(key);\n }\n else if (target instanceof Set\n || target instanceof WeakSet\n )\n {\n this._value = (target as any as WeakSet<any>).has(key) as any;\n }\n else\n {\n this._value = (target as any)[key as any];\n }\n }\n\n triggerIfChanged()\n {\n\n }\n\n /**\n * 追踪属性的变化。\n *\n * 当属性被访问时,将会追踪属性的变化。\n *\n * @param target 目标对象。\n * @param key 属性名。\n * @returns\n */\n static track(target: object, type: TrackOpTypes, key: unknown): void\n {\n if (!Reactivity.activeReactivity) return;\n\n const dep = property(target as any, key as any);\n\n // 取值,建立依赖关系。\n dep.track();\n }\n\n /**\n * @private\n */\n static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();\n\n /**\n * 触发属性的变化。\n *\n * @param target 目标对象。\n * @param type 操作类型。\n * @param key 属性名。\n * @param newValue 新值。\n * @param oldValue 旧值。\n * @returns\n */\n static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void\n {\n const depsMap = this._targetMap.get(target);\n\n if (!depsMap) return;\n\n const run = (dep: PropertyReactivity<any, any> | undefined) =>\n {\n if (dep)\n {\n // 触发属性的变化。\n dep.value = newValue;\n }\n };\n\n batchRun(() =>\n {\n if (type === TriggerOpTypes.CLEAR)\n {\n // collection being cleared\n // trigger all effects for target\n depsMap.forEach(run);\n }\n else\n {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n\n if (targetIsArray && key === 'length')\n {\n const newLength = Number(newValue);\n\n depsMap.forEach((dep, key) =>\n {\n if (\n key === 'length'\n || key === ARRAY_ITERATE_KEY\n || (!isSymbol(key) && key >= newLength)\n )\n {\n run(dep);\n }\n });\n }\n else\n {\n // schedule runs for SET | ADD | DELETE\n if (key !== undefined || depsMap.has(undefined))\n {\n run(depsMap.get(key));\n }\n\n // schedule ARRAY_ITERATE for any numeric key change (length is handled above)\n if (isArrayIndex)\n {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n\n // also run for iteration key on ADD | DELETE | Map.SET\n switch (type)\n {\n case TriggerOpTypes.ADD:\n if (!targetIsArray)\n {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target))\n {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n else if (isArrayIndex)\n {\n // new index added to array -> length changes\n run(depsMap.get('length'));\n }\n break;\n case TriggerOpTypes.DELETE:\n if (!targetIsArray)\n {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target))\n {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case TriggerOpTypes.SET:\n if (isMap(target))\n {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n });\n }\n}\n","/* eslint-disable prefer-rest-params */\n\nimport { batchRun } from './batch';\nimport { noTrack } from './Reactivity';\nimport { PropertyReactivity } from './property';\nimport { isProxy, toReactive } from './reactive';\nimport { ARRAY_ITERATE_KEY, TrackOpTypes } from './shared/constants';\nimport { isArray, toRaw } from './shared/general';\n\n/**\n * 数组方法增强对象。\n *\n * 为数组提供响应式增强的方法实现,包括:\n * 1. 迭代器方法:Symbol.iterator、entries、keys、values\n * 2. 查找方法:includes、indexOf、lastIndexOf、find、findIndex、findLast、findLastIndex\n * 3. 遍历方法:forEach、map、filter、some、every、reduce、reduceRight\n * 4. 修改方法:push、pop、shift、unshift、splice、toReversed、toSorted、toSpliced\n * 5. 其他方法:concat、join\n */\nexport const arrayInstrumentations: Record<string | symbol, Function> = <any>{\n __proto__: null,\n\n /**\n * 返回一个迭代器,用于遍历数组的响应式值。\n *\n * 实现了以下功能:\n * 1. 创建数组的迭代器\n * 2. 自动将迭代的值转换为响应式\n * 3. 自动追踪数组的访问\n *\n * @returns 数组的迭代器\n */\n [Symbol.iterator]()\n {\n return iterator(this, Symbol.iterator, toReactive);\n },\n\n /**\n * 连接数组并返回新数组。\n *\n * 实现了以下功能:\n * 1. 处理响应式数组的连接\n * 2. 自动将参数中的数组转换为响应式\n * 3. 保持原始值的引用\n *\n * @param args 要连接的数组或值\n * @returns 连接后的新数组\n */\n concat(...args: unknown[])\n {\n return reactiveReadArray(this).concat(\n ...args.map((x) => (isArray(x) ? reactiveReadArray(x) : x)),\n );\n },\n\n /**\n * 返回一个迭代器,用于遍历数组的键值对。\n *\n * 实现了以下功能:\n * 1. 创建数组的键值对迭代器\n * 2. 自动将值转换为响应式\n * 3. 自动追踪数组的访问\n *\n * @returns 数组的键值对迭代器\n */\n entries()\n {\n return iterator(this, 'entries', (value: [number, unknown]) =>\n {\n value[1] = toReactive(value[1]);\n\n return value;\n });\n },\n\n /**\n * 测试数组中的所有元素是否都通过了指定函数的测试。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的测试\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 如果所有元素都通过测试则返回 true,否则返回 false\n */\n every(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'every', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 创建一个新数组,包含通过指定函数测试的所有元素。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 自动将结果转换为响应式\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 包含通过测试的元素的新数组\n */\n filter(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'filter', fn, thisArg, (v) => v.map(toReactive), arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的第一个元素。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 自动将结果转换为响应式\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 第一个满足测试的元素,如果没有则返回 undefined\n */\n find(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'find', fn, thisArg, toReactive, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的第一个元素的索引。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的查找\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 第一个满足测试的元素的索引,如果没有则返回 -1\n */\n findIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findIndex', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的最后一个元素。\n *\n * 实现了以下功能:\n * 1. 从后向前遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 自动将结果转换为响应式\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 最后一个满足测试的元素,如果没有则返回 undefined\n */\n findLast(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findLast', fn, thisArg, toReactive, arguments);\n },\n\n /**\n * 返回数组中满足指定测试函数的最后一个元素的索引。\n *\n * 实现了以下功能:\n * 1. 从后向前遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的查找\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 最后一个满足测试的元素的索引,如果没有则返回 -1\n */\n findLastIndex(fn: (item: unknown, index: number, array: unknown[]) => boolean,\n thisArg?: unknown,\n )\n {\n return apply(this, 'findLastIndex', fn, thisArg, undefined, arguments);\n },\n\n // flat, flatMap 可以从 ARRAY_ITERATE 中受益,但实现起来不太直接\n\n /**\n * 对数组中的每个元素执行指定函数。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行回调函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的遍历\n *\n * @param fn 回调函数\n * @param thisArg 回调函数的 this 值\n */\n forEach(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'forEach', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 判断数组是否包含指定元素。\n *\n * 实现了以下功能:\n * 1. 处理响应式值的查找\n * 2. 自动追踪数组的访问\n * 3. 处理代理对象的查找\n *\n * @param args 要查找的元素\n * @returns 如果数组包含该元素则返回 true,否则返回 false\n */\n includes(...args: unknown[])\n {\n return searchProxy(this, 'includes' as any, args);\n },\n\n /**\n * 返回数组中指定元素第一次出现的索引。\n *\n * 实现了以下功能:\n * 1. 处理响应式值的查找\n * 2. 自动追踪数组的访问\n * 3. 处理代理对象的查找\n *\n * @param args 要查找的元素\n * @returns 元素第一次出现的索引,如果没有则返回 -1\n */\n indexOf(...args: unknown[])\n {\n return searchProxy(this, 'indexOf', args);\n },\n\n /**\n * 将数组的所有元素连接成一个字符串。\n *\n * 实现了以下功能:\n * 1. 处理响应式数组的连接\n * 2. 自动追踪数组的访问\n * 3. 保持原始值的引用\n *\n * @param separator 分隔符\n * @returns 连接后的字符串\n */\n join(separator?: string)\n {\n return reactiveReadArray(this).join(separator);\n },\n\n // keys() 迭代器只读取 length,不需要优化\n\n /**\n * 返回数组中指定元素最后一次出现的索引。\n *\n * 实现了以下功能:\n * 1. 处理响应式值的查找\n * 2. 自动追踪数组的访问\n * 3. 处理代理对象的查找\n *\n * @param args 要查找的元素\n * @returns 元素最后一次出现的索引,如果没有则返回 -1\n */\n lastIndexOf(...args: unknown[])\n {\n return searchProxy(this, 'lastIndexOf', args);\n },\n\n /**\n * 创建一个新数组,包含对原数组每个元素调用指定函数的结果。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行映射函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的映射\n *\n * @param fn 映射函数\n * @param thisArg 映射函数的 this 值\n * @returns 包含映射结果的新数组\n */\n map(fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'map', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 移除数组的最后一个元素并返回该元素。\n *\n * 实现了以下功能:\n * 1. 移除最后一个元素\n * 2. 避免跟踪长度变化\n * 3. 处理响应式值的移除\n *\n * @returns 被移除的元素\n */\n pop()\n {\n return noTracking(this, 'pop');\n },\n\n /**\n * 向数组末尾添加一个或多个元素。\n *\n * 实现了以下功能:\n * 1. 添加新元素\n * 2. 避免跟踪长度变化\n * 3. 处理响应式值的添加\n *\n * @param args 要添加的元素\n * @returns 数组的新长度\n */\n push(...args: unknown[])\n {\n return noTracking(this, 'push', args);\n },\n\n /**\n * 对数组中的每个元素执行累加器函数。\n *\n * 实现了以下功能:\n * 1. 从左到右遍历数组元素\n * 2. 对每个元素执行累加器函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的累加\n *\n * @param fn 累加器函数\n * @param args 初始值(可选)\n * @returns 累加的结果\n */\n reduce(fn: (\n acc: unknown,\n item: unknown,\n index: number,\n array: unknown[],\n ) => unknown,\n ...args: unknown[]\n )\n {\n return reduce(this, 'reduce', fn, args);\n },\n\n /**\n * 从右到左对数组中的每个元素执行累加器函数。\n *\n * 实现了以下功能:\n * 1. 从右到左遍历数组元素\n * 2. 对每个元素执行累加器函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的累加\n *\n * @param fn 累加器函数\n * @param args 初始值(可选)\n * @returns 累加的结果\n */\n reduceRight(\n fn: (\n acc: unknown,\n item: unknown,\n index: number,\n array: unknown[],\n ) => unknown,\n ...args: unknown[]\n )\n {\n return reduce(this, 'reduceRight', fn, args);\n },\n\n /**\n * 移除数组的第一个元素并返回该元素。\n *\n * 实现了以下功能:\n * 1. 移除第一个元素\n * 2. 避免跟踪长度变化\n * 3. 处理响应式值的移除\n *\n * @returns 被移除的元素\n */\n shift()\n {\n return noTracking(this, 'shift');\n },\n\n // slice 可以使用 ARRAY_ITERATE,但似乎也需要范围追踪\n\n /**\n * 测试数组中的某些元素是否通过了指定函数的测试。\n *\n * 实现了以下功能:\n * 1. 遍历数组元素\n * 2. 对每个元素执行测试函数\n * 3. 自动追踪数组的访问\n * 4. 处理响应式值的测试\n *\n * @param fn 测试函数\n * @param thisArg 测试函数的 this 值\n * @returns 如果有元素通过测试则返回 true,否则返回 false\n */\n some(\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n )\n {\n return apply(this, 'some', fn, thisArg, undefined, arguments);\n },\n\n /**\n * 通过删除或替换现有元素或添加新元素来修改数组。\n *\n * 实现了以下功能:\n * 1. 修改数组内容\n * 2. 避免跟踪长度变化\n * 3. 处理响应式值的修改\n *\n * @param args 要删除的起始索引、要删除的元素数量和要添加的元素\n * @returns 包含被删除元素的新数组\n */\n splice(...args: unknown[])\n {\n return noTracking(this, 'splice', args);\n },\n\n /**\n * 返回一个新数组,包含原数组的反转副本。\n *\n * 实现了以下功能:\n * 1. 创建数组的反转副本\n * 2. 自动将结果转换为响应式\n * 3. 保持原始值的引用\n *\n * @returns 反转后的新数组\n */\n toReversed()\n {\n return reactiveReadArray(this).toReversed();\n },\n\n /**\n * 返回一个新数组,包含原数组的排序副本。\n *\n * 实现了以下功能:\n * 1. 创建数组的排序副本\n * 2. 自动将结果转换为响应式\n * 3. 保持原始值的引用\n *\n * @param comparer 比较函数\n * @returns 排序后的新数组\n */\n toSorted(comparer?: (a: unknown, b: unknown) => number)\n {\n return reactiveReadArray(this).toSorted(comparer);\n },\n\n /**\n * 返回一个新数组,包含原数组的切片副本。\n *\n * 实现了以下功能:\n * 1. 创建数组的切片副本\n * 2. 自动将结果转换为响应式\n * 3. 保持原始值的引用\n *\n * @param args 起始索引和结束索引\n * @returns 切片后的新数组\n */\n toSpliced(...args: unknown[])\n {\n // @ts-expect-error user code may run in es2016+\n return reactiveReadArray(this).toSpliced(...args);\n },\n\n /**\n * 向数组开头添加一个或多个元素。\n *\n * 实现了以下功能:\n * 1. 添加新元素\n * 2. 避免跟踪长度变化\n * 3. 处理响应式值的添加\n *\n * @param args 要添加的元素\n * @returns 数组的新长度\n */\n unshift(...args: unknown[])\n {\n return noTracking(this, 'unshift', args);\n },\n\n /**\n * 返回一个迭代器,用于遍历数组的值。\n *\n * 实现了以下功能:\n * 1. 创建数组的值迭代器\n * 2. 自动将迭代的值转换为响应式\n * 3. 自动追踪数组的访问\n *\n * @returns 数组的值迭代器\n */\n values()\n {\n return iterator(this, 'values', toReactive);\n },\n};\n\n/**\n * 创建数组的迭代器。\n *\n * 实现了以下功能:\n * 1. 创建数组的迭代器\n * 2. 自动将迭代的值转换为响应式\n * 3. 自动追踪数组的访问\n *\n * 注意:在这里获取 ARRAY_ITERATE 依赖并不完全等同于在代理数组上调用迭代。\n * 创建迭代器时不会访问任何数组属性:\n * 只有在调用 .next() 时才会访问 length 和索引。\n * 从极端情况来看,迭代器可以在一个 effect scope 中创建,\n * 在另一个 scope 中部分迭代,然后在第三个 scope 中继续迭代。\n * 考虑到 JS 迭代器只能读取一次,这似乎不是一个合理的用例,\n * 所以这种跟踪简化是可以接受的。\n *\n * @param self 目标数组\n * @param method 迭代器方法名\n * @param wrapValue 值包装函数,用于将值转换为响应式\n * @returns 数组的迭代器\n */\nfunction iterator(\n self: unknown[],\n method: keyof Array<unknown>,\n wrapValue: (value: any) => unknown,\n)\n{\n const arr = shallowReadArray(self);\n const iter = (arr[method] as any)() as IterableIterator<unknown> & {\n _next: IterableIterator<unknown>['next']\n };\n\n if (arr !== self)\n {\n iter._next = iter.next;\n iter.next = () =>\n {\n const result = iter._next();\n\n if (result.value)\n {\n result.value = wrapValue(result.value);\n }\n\n return result;\n };\n }\n\n return iter;\n}\n\n/**\n * 创建数组的浅层响应式副本。\n *\n * 实现了以下功能:\n * 1. 跟踪数组的迭代操作\n * 2. 返回原始数组的引用\n *\n * 注意:此函数只跟踪数组的迭代操作,不会递归转换数组中的值。\n * 主要用于优化性能,避免不必要的响应式转换。\n *\n * @param arr 目标数组\n * @returns 数组的浅层响应式副本\n */\nfunction shallowReadArray<T>(arr: T[]): T[]\n{\n PropertyReactivity.track((arr = toRaw(arr)), TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n\n return arr;\n}\n\n/**\n * 创建数组的深层响应式副本。\n *\n * 实现了以下功能:\n * 1. 跟踪数组的迭代操作\n * 2. 递归转换所有值为响应式\n *\n * 注意:此函数会递归转换数组中的所有值为响应式,\n * 包括嵌套的数组和对象。这可能会导致性能开销,\n * 但确保了所有值都是响应式的。\n *\n * @param array 目标数组\n * @returns 数组的深层响应式副本\n */\nfunction reactiveReadArray<T>(array: T[]): T[]\n{\n const raw = toRaw(array);\n\n if (raw === array) return raw;\n PropertyReactivity.track(raw, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n\n return raw.map(toReactive);\n}\n\n/**\n * 数组方法类型。\n *\n * 包括所有需要增强的数组方法。\n * 注意:在代码库中我们强制使用 es2016,但用户代码可能在更高版本的环境中运行。\n */\ntype ArrayMethods = keyof Array<any> | 'findLast' | 'findLastIndex';\n\n/**\n * 应用数组方法。\n *\n * 实现了以下功能:\n * 1. 调用数组方法\n * 2. 自动追踪数组的访问\n * 3. 处理回调函数的执行\n * 4. 处理返回值的转换\n *\n * 注意:如果调用的方法来自用户扩展的 Array,参数将是未知的\n * (未知顺序和未知参数类型)。在这种情况下,我们跳过 shallowReadArray\n * 处理,直接使用 self 调用 apply。\n *\n * @param self 目标数组\n * @param method 方法名\n * @param fn 回调函数\n * @param thisArg 回调函数的 this 值\n * @param wrappedRetFn 返回值包装函数,用于将返回值转换为响应式\n * @param args 方法参数\n * @returns 方法的执行结果\n */\nfunction apply(\n self: unknown[],\n method: ArrayMethods,\n fn: (item: unknown, index: number, array: unknown[]) => unknown,\n thisArg?: unknown,\n wrappedRetFn?: (result: any) => unknown,\n args?: IArguments,\n)\n{\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self;\n const methodFn = arr[method] as Function;\n\n // #11759\n // If the method being called is from a user-extended Array, the arguments will be unknown\n // (unknown order and unknown parameter types). In this case, we skip the shallowReadArray\n // handling and directly call apply with self.\n if (methodFn !== Array.prototype[method as any])\n {\n const result = methodFn.apply(self, args);\n\n return needsWrap ? toReactive(result) : result;\n }\n\n let wrappedFn = fn;\n\n if (arr !== self)\n {\n if (needsWrap)\n {\n wrappedFn = function (this: unknown, item, index)\n {\n return fn.call(this, toReactive(item), index, self);\n };\n }\n else if (fn.length > 2)\n {\n wrappedFn = function (this: unknown, item, index)\n {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\n\n/**\n * 应用数组的归约方法。\n *\n * 实现了以下功能:\n * 1. 调用数组的归约方法\n * 2. 自动追踪数组的访问\n * 3. 处理回调函数的执行\n * 4. 处理响应式值的归约\n *\n * 注意:此函数用于处理 reduce 和 reduceRight 方法,\n * 确保在归约过程中正确处理响应式值。\n *\n * @param self 目标数组\n * @param method 方法名('reduce' 或 'reduceRight')\n * @param fn 归约函数\n * @param args 方法参数,包括初始值(可选)\n * @returns 归约的结果\n */\nfunction reduce(\n self: unknown[],\n method: keyof Array<any>,\n fn: (acc: unknown, item: unknown, index: number, array: unknown[]) => unknown,\n args: unknown[],\n)\n{\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n\n if (arr !== self)\n {\n wrappedFn = function (this: unknown, acc, item, index)\n {\n return fn.call(this, acc, toReactive(item), index, self);\n };\n }\n\n return (arr[method] as any)(wrappedFn, ...args);\n}\n\n/**\n * 在数组中搜索元素。\n *\n * 实现了以下功能:\n * 1. 处理响应式值的搜索\n * 2. 自动追踪数组的访问\n * 3. 处理代理对象的搜索\n *\n * 注意:我们首先使用原始参数(可能是响应式的)运行方法。\n * 如果那不起作用,我们再次使用原始值运行。\n * 这确保了在搜索响应式值时能够正确处理。\n *\n * @param self 目标数组\n * @param method 方法名('includes'、'indexOf' 或 'lastIndexOf')\n * @param args 搜索参数\n * @returns 搜索的结果(布尔值或索引)\n */\nfunction searchProxy(\n self: unknown[],\n method: keyof Array<any>,\n args: unknown[],\n)\n{\n const arr = toRaw(self) as any;\n\n PropertyReactivity.track(arr, TrackOpTypes.ITERATE, ARRAY_ITERATE_KEY);\n // we run the method using the original args first (which may be reactive)\n const res = arr[method](...args);\n\n // if that didn't work, run it again using raw values.\n if ((res === -1 || res === false) && isProxy(args[0]))\n {\n args[0] = toRaw(args[0]);\n\n return arr[method](...args);\n }\n\n return res;\n}\n\n/**\n * 执行不跟踪的数组操作。\n *\n * 实现了以下功能:\n * 1. 执行数组操作\n * 2. 避免跟踪长度变化\n * 3. 在批处理中执行操作\n *\n * 注意:这用于避免在某些情况下(#2137)由于跟踪长度变化而导致的无限循环。\n * 通过使用批处理和禁用跟踪,我们可以安全地执行这些操作。\n *\n * @param self 目标数组\n * @param method 方法名('push'、'pop'、'shift'、'unshift' 或 'splice')\n * @param args 方法参数\n * @returns 操作的执行结果\n */\nfunction noTracking(\n self: unknown[],\n method: keyof Array<any>,\n args: unknown[] = [],\n)\n{\n const res = batchRun(() =>\n noTrack(() =>\n (toRaw(self) as any)[method].apply(self, args),\n ),\n );\n\n return res;\n}\n","import { batchRun } from './batch';\nimport { Reactivity } from './Reactivity';\nimport { toReactive } from './reactive';\nimport { ReactiveFlags } from './shared/constants';\nimport { hasChanged, toRaw } from './shared/general';\n\n/**\n * 创建一个引用,该引用的值可以被响应式系统追踪和更新。\n *\n * ref 是响应式系统中最基本的响应式对象。\n * 它可以包装任何类型的值,使其成为响应式的。\n *\n * 特点:\n * 1. 可以包装任何类型的值\n * 2. 通过 .value 访问和修改值\n * 3. 自动解包原始值\n * 4. 支持嵌套的响应式对象\n *\n * @param value 要包装的值\n * @returns 包含 value 属性的响应式引用对象\n */\nexport function ref<T>(value?: T): Ref<T>\n{\n if (isRef(value))\n {\n return value as any;\n }\n\n return new RefReactivity<T>(value) as any;\n}\n\n/**\n * 判断一个对象是否为引用。\n *\n * 通过检查对象是否具有 IS_REF 标志来判断。\n *\n * @param r 要检查的对象\n * @returns 如果是引用则返回 true,否则返回 false\n */\nexport function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;\nexport function isRef(r: any): r is Ref\n{\n return r ? r[ReactiveFlags.IS_REF] === true : false;\n}\n\n/**\n * 引用反应式节点接口。\n *\n * 继承自 Ref 接口,表示这是一个引用反应式节点。\n */\nexport interface RefReactivity<T = any> extends Ref<T> { }\n\n/**\n * 引用反应式节点类。\n *\n * 当使用 ref 函数时,会创建一个 RefReactivity 对象。\n * 实现了引用的核心功能:\n * 1. 值的存储和访问\n * 2. 值的自动解包\n * 3. 变更通知\n * 4. 依赖追踪\n */\nexport class RefReactivity<T = any> extends Reactivity<T> implements Ref<T>\n{\n /**\n * 标识这是一个 ref 对象。\n *\n * 用于 isRef 函数判断对象是否为引用。\n */\n public readonly [ReactiveFlags.IS_REF] = true;\n\n /**\n * 获取引用的值。\n *\n * 取值时会:\n * 1. 建立依赖关系\n * 2. 返回当前值\n */\n get value()\n {\n this.track();\n\n return this._value;\n }\n\n /**\n * 设置引用的值。\n *\n * 设置值时会:\n * 1. 比较新旧值是否发生变化\n * 2. 如果值发生变化,则:\n * - 触发更新通知\n * - 更新原始值\n * - 更新响应式值\n *\n * @param v 要设置的新值\n */\n set value(v: T)\n {\n const oldValue = this._rawValue;\n const newValue = toRaw(v);\n\n if (!hasChanged(oldValue, newValue)) return;\n\n batchRun(() =>\n {\n this.trigger();\n\n this._rawValue = newValue;\n this._value = toReactive(newValue);\n });\n }\n\n /**\n * 原始值。\n *\n * 存储未经响应式处理的原始值。\n * 用于比较值是否发生变化。\n *\n * @private\n */\n private _rawValue: T;\n\n /**\n * 创建引用反应式节点。\n *\n * @param value 要包装的值\n */\n constructor(value: T)\n {\n super();\n this._rawValue = toRaw(value);\n this._value = toReactive(value);\n }\n}\n\n/**\n * 引用接口。\n *\n * 定义了引用的基本结构:\n * 1. value: 引用的值,可读可写\n * 2. RefSymbol: 用于标识这是一个引用\n */\nexport interface Ref<T = any, S = T>\n{\n get value(): T\n set value(_: S)\n [RefSymbol]: true\n}\ndeclare const RefSymbol: unique symbol;\n","import { arrayInstrumentations } from './arrayInstrumentations';\nimport { reactive, reactiveMap } from './reactive';\nimport { isRef } from './ref';\nimport { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';\nimport { PropertyReactivity } from './property';\n\n/**\n * 基础响应式处理器。\n *\n * 实现了 Proxy 的 get 拦截器,用于:\n * 1. 响应式对象的标识和原始对象获取\n * 2. 数组方法的特殊处理\n * 3. 属性的依赖追踪\n * 4. 值的自动解包和响应式转换\n */\nclass BaseReactiveHandler implements ProxyHandler<Target>\n{\n /**\n * 获取对象的属性值。\n *\n * 实现了以下功能:\n * 1. 响应式对象标识检查\n * 2. 原始对象获取\n * 3. 数组方法拦截\n * 4. 属性依赖追踪\n * 5. 值的自动解包\n * 6. 对象的自动响应式转换\n *\n * @param target 被代理的原始对象\n * @param key 要获取的属性名\n * @param receiver 代理对象本身\n * @returns 获取到的属性值\n */\n get(target: Target, key: string | symbol, receiver: object): any\n {\n // 检查是否为响应式对象\n if (key === ReactiveFlags.IS_REACTIVE)\n {\n return true;\n }\n // 获取原始对象\n else if (key === ReactiveFlags.RAW)\n {\n if (\n receiver === reactiveMap.get(target)\n // receiver 不是响应式代理,但具有相同的原型\n // 这意味着 receiver 是响应式代理的用户代理\n || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)\n )\n {\n return target;\n }\n\n // 提前返回 undefined\n return;\n }\n\n const targetIsArray = isArray(target);\n\n // 处理数组方法\n let fn: Function | undefined;\n\n if (targetIsArray && (fn = arrayInstrumentations[key]))\n {\n return fn;\n }\n // 处理 hasOwnProperty 方法\n if (key === 'hasOwnProperty')\n {\n return hasOwnProperty;\n }\n\n // 获取属性值\n const res = Reflect.get(\n target,\n key,\n isRef(target) ? target : receiver,\n );\n\n // 跳过内置 Symbol 和非追踪键的依赖追踪\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))\n {\n return res;\n }\n\n // 追踪属性访问\n PropertyReactivity.track(target, TrackOpTypes.GET, key as any);\n\n // 自动解包 ref 值\n if (isRef(res))\n {\n return targetIsArray && isIntegerKey(key) ? res : res.value;\n }\n\n // 自动转换对象为响应式\n if (isObject(res))\n {\n return reactive(res);\n }\n\n return res;\n }\n}\n\n/**\n * 可变响应式处理器。\n *\n * 继承自基础响应式处理器,增加了:\n * 1. 属性设置拦截\n * 2. 属性删除拦截\n * 3. 属性存在性检查拦截\n * 4. 属性遍历拦截\n */\nclass MutableReactiveHandler extends BaseReactiveHandler\n{\n /**\n * 设置对象的属性值。\n *\n * 实现了以下功能:\n * 1. 值的原始化处理\n * 2. ref 值的特殊处理\n * 3. 属性变更通知\n * 4. 数组长度的特殊处理\n *\n * @param target 被代理的原始对象\n * @param key 要设置的属性名\n * @param value 要设置的新值\n * @param receiver 代理对象本身\n * @returns 设置是否成功\n */\n set(\n target: Record<string | symbol, unknown>,\n key: string | symbol,\n value: unknown,\n receiver: object,\n ): boolean\n {\n let oldValue = target[key];\n\n // 获取原始值进行比较\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n\n // 处理 ref 值的特殊情况\n if (!isArray(target) && isRef(oldValue) && !isRef(value))\n {\n oldValue.value = value;\n\n return true;\n }\n\n // 检查属性是否存在\n const hadKey\n = isArray(target) && isIntegerKey(key)\n ? Number(key) < target.length\n : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver,\n );\n\n // 确保目标在原始原型链中\n __DEV__ && console.assert(target === toRaw(receiver));\n\n // 触发属性变更通知\n if (target === toRaw(receiver))\n {\n if (!hadKey)\n {\n // 新增属性\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\n }\n else if (hasChanged(value, oldValue))\n {\n // 修改属性\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\n }\n }\n\n return result;\n }\n\n /**\n * 删除对象的属性。\n *\n * 实现了以下功能:\n * 1. 属性删除操作\n * 2. 删除后的变更通知\n *\n * @param target 被代理的原始对象\n * @param key 要删除的属性名\n * @returns 删除是否成功\n */\n deleteProperty(\n target: Record<string | symbol, unknown>,\n key: string | symbol,\n ): boolean\n {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n\n if (result && hadKey)\n {\n // 触发删除通知\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\n }\n\n return result;\n }\n\n /**\n * 检查对象是否包含某个属性。\n *\n * 实现了以下功能:\n * 1. 属性存在性检查\n * 2. 属性访问依赖追踪\n *\n * @param target 被代理的原始对象\n * @param key 要检查的属性名\n * @returns 属性是否存在\n */\n has(target: Record<string | symbol, unknown>, key: string | symbol): boolean\n {\n const result = Reflect.has(target, key);\n\n if (!isSymbol(key) || !builtInSymbols.has(key))\n {\n // 追踪属性访问\n PropertyReactivity.track(target, TrackOpTypes.HAS, key);\n }\n\n return result;\n }\n\n /**\n * 获取对象的所有属性名。\n *\n * 实现了以下功能:\n * 1. 属性遍历\n * 2. 遍历操作的依赖追踪\n *\n * @param target 被代理的原始对象\n * @returns 对象的所有属性名数组\n */\n ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]\n {\n // 追踪遍历操作\n PropertyReactivity.track(\n target,\n TrackOpTypes.ITERATE,\n isArray(target) ? 'length' : ITERATE_KEY,\n );\n\n return Reflect.ownKeys(target);\n }\n}\n\n/**\n * 可变响应式处理器实例。\n *\n * 用于创建可变的响应式对象。\n */\nexport const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();\n\n/**\n * 自定义 hasOwnProperty 方法。\n *\n * 实现了以下功能:\n * 1. 属性存在性检查\n * 2. 属性访问依赖追踪\n *\n * @param this 调用对象\n * @param key 要检查的属性名\n * @returns 属性是否存在\n */\nfunction hasOwnProperty(this: object, key: unknown)\n{\n // #10455 hasOwnProperty 可能被非字符串值调用\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n\n // 追踪属性访问\n PropertyReactivity.track(obj, TrackOpTypes.HAS, key);\n\n return obj.hasOwnProperty(key as string);\n}\n\n/**\n * 内置 Symbol 集合。\n *\n * 用于过滤不需要追踪的 Symbol 属性。\n */\nconst builtInSymbols = new Set(\n /* @__PURE__ */\n Object.getOwnPropertyNames(Symbol)\n // ios10.x Object.getOwnPropertyNames(Symbol) 可以枚举 'arguments' 和 'caller'\n // 但在 Symbol 上访问它们会导致 TypeError,因为 Symbol 是严格模式函数\n .filter((key) => key !== 'arguments' && key !== 'caller')\n .map((key) => Symbol[key as keyof SymbolConstructor])\n .filter(isSymbol),\n);\n\n/**\n * 非追踪键集合。\n *\n * 用于过滤不需要追踪的属性名。\n */\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\n","import { toReactive } from './reactive';\nimport { ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';\nimport { hasChanged, hasOwn, isMap, Target, toRaw, toRawType, warn } from './shared/general';\nimport { PropertyReactivity } from './property';\n\n/**\n * 可变集合响应式处理器。\n *\n * 用于处理集合类型(Map、Set、WeakMap、WeakSet)的响应式代理。\n * 通过拦截集合的操作方法,实现响应式功能。\n */\nexport const mutableCollectionHandlers: ProxyHandler<CollectionTypes> = {\n get: createInstrumentationGetter(),\n};\n\n/**\n * 创建集合方法的拦截器。\n *\n * 返回一个 get 拦截器函数,用于:\n * 1. 处理响应式标识和原始对象获取\n * 2. 拦截集合的操作方法\n * 3. 转发其他属性访问\n *\n * @returns 集合方法的拦截器函数\n */\nfunction createInstrumentationGetter()\n{\n const instrumentations = createInstrumentations();\n\n return (\n target: CollectionTypes,\n key: string | symbol,\n receiver: CollectionTypes,\n ) =>\n {\n // 处理响应式标识\n if (key === ReactiveFlags.IS_REACTIVE)\n {\n return true;\n }\n // 获取原始对象\n else if (key === ReactiveFlags.RAW)\n {\n return target;\n }\n\n // 如果方法在增强对象中存在,则使用增强版本\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target\n ? instrumentations\n : target,\n key,\n receiver,\n );\n };\n}\n\n/**\n * 集合方法增强类型。\n *\n * 定义了所有需要增强的集合方法的类型。\n */\ntype Instrumentations = Record<string | symbol, Function | number>;\n\n/**\n * 创建集合方法的增强实现。\n *\n * 为集合类型(Map、Set、WeakMap、WeakSet)创建响应式增强方法:\n * 1. 基本操作:get、set、has、delete、clear\n * 2. 遍历操作:forEach、keys、values、entries\n * 3. 大小获取:size\n *\n * @returns 增强后的集合方法对象\n */\nfunction createInstrumentations(): Instrumentations\n{\n const instrumentations: Instrumentations = {\n /**\n * 获取 Map 中的值。\n *\n * 实现了以下功能:\n * 1. 支持原始键和响应式键的查找\n * 2. 自动追踪键的访问\n * 3. 自动将返回值转换为响应式\n *\n * @param key 要查找的键\n * @returns 找到的值,如果不存在则返回 undefined\n */\n get(this: MapTypes, key: unknown)\n {\n // #1772: readonly(reactive(Map)) 应该返回只读的响应式值\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n\n // 追踪键的访问\n if (hasChanged(key, rawKey))\n {\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, key);\n }\n PropertyReactivity.track(rawTarget, TrackOpTypes.GET, rawKey);\n\n const { has } = getProto(rawTarget);\n const wrap = toReactive;\n\n if (has.call(rawTarget, key))\n {\n return wrap(target.get(key));\n }\n else if (has.call(rawTarget, rawKey))\n {\n return wrap(target.get(rawKey));\n }\n else if (target !== rawTarget)\n {\n // #3602 readonly(reactive(Map))\n // 确保嵌套的响应式 Map 可以追踪自身\n target.get(key);\n }\n },\n\n /**\n * 获取集合的大小。\n *\n * 实现了以下功能:\n * 1. 追踪集合大小的访问\n * 2. 返回集合的实际大小\n */\n get size()\n {\n const target = (this as unknown as IterableCollections)[ReactiveFlags.RAW];\n\n PropertyReactivity.track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY);\n\n return Reflect.get(target, 'size', target);\n },\n\n /**\n * 检查集合是否包含某个值。\n *\n * 实现了以下功能:\n * 1. 支持原始键和响应式键的检查\n * 2. 自动追踪键的检查\n *\n * @param key 要检查的键\n * @returns 如果集合包含该键则返回 true,否则返回 false\n */\n has(this: CollectionTypes, key: unknown): boolean\n {\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n\n // 追踪键的检查\n if (hasChanged(key, rawKey))\n {\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, key);\n }\n PropertyReactivity.track(rawTarget, TrackOpTypes.HAS, rawKey);\n\n return key === rawKey\n ? target.has(key)\n : target.has(key) || target.has(rawKey);\n },\n\n /**\n * 遍历集合中的所有元素。\n *\n * 实现了以下功能:\n * 1. 追踪集合的遍历操作\n * 2. 自动将遍历的值转换为响应式\n * 3. 保持回调函数的 this 上下文\n *\n * @param callback 遍历回调函数\n * @param thisArg 回调函数的 this 值\n */\n forEach(this: IterableCollections, callback: Function, thisArg?: unknown)\n {\n const observed = this;\n const target = observed[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const wrap = toReactive;\n\n PropertyReactivity.track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY);\n\n return target.forEach((value: unknown, key: unknown) =>\n // 重要:确保回调函数\n // 1. 使用响应式 map 作为 this 和第三个参数\n // 2. 接收到的值应该是相应的响应式/只读版本\n callback.call(thisArg, wrap(value), wrap(key), observed),\n );\n },\n\n /**\n * 向 Set 中添加值。\n *\n * 实现了以下功能:\n * 1. 自动将值转换为原始值\n * 2. 避免重复添加\n * 3. 触发添加操作的通知\n *\n * @param value 要添加的值\n * @returns 集合本身,支持链式调用\n */\n add(this: SetTypes, value: unknown)\n {\n value = toRaw(value);\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n\n if (!hadKey)\n {\n target.add(value);\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, value, value);\n }\n\n return this;\n },\n\n /**\n * 设置 Map 中的值。\n *\n * 实现了以下功能:\n * 1. 自动将值转换为原始值\n * 2. 支持原始键和响应式键的设置\n * 3. 触发添加或修改操作的通知\n *\n * @param key 要设置的键\n * @param value 要设置的值\n * @returns 集合本身,支持链式调用\n */\n set(this: MapTypes, key: unknown, value: unknown)\n {\n value = toRaw(value);\n const target = toRaw(this);\n const { has, get } = getProto(target);\n\n let hadKey = has.call(target, key);\n\n if (!hadKey)\n {\n key = toRaw(key);\n hadKey = has.call(target, key);\n }\n else if (__DEV__)\n {\n checkIdentityKeys(target, has, key);\n }\n\n const oldValue = get.call(target, key);\n\n target.set(key, value);\n if (!hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);\n }\n else if (hasChanged(value, oldValue))\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);\n }\n\n return this;\n },\n\n /**\n * 从集合中删除值。\n *\n * 实现了以下功能:\n * 1. 支持原始键和响应式键的删除\n * 2. 触发删除操作的通知\n *\n * @param key 要删除的键\n * @returns 如果删除成功则返回 true,否则返回 false\n */\n delete(this: CollectionTypes, key: unknown)\n {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n\n if (!hadKey)\n {\n key = toRaw(key);\n hadKey = has.call(target, key);\n }\n else if (__DEV__)\n {\n checkIdentityKeys(target, has, key);\n }\n\n const oldValue = get ? get.call(target, key) : undefined;\n // 在触发反应之前执行操作\n const result = target.delete(key);\n\n if (hadKey)\n {\n PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);\n }\n\n return result;\n },\n\n /**\n * 清空集合。\n *\n * 实现了以下功能:\n * 1. 清空集合中的所有元素\n * 2. 触发清空操作的通知\n * 3. 在开发模式下保存旧值用于调试\n *\n * @returns 如果清空成功则返回 true,否则返回 false\n */\n clear(this: IterableCollections)\n {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = __DEV__\n ? isMap(target)\n ? new Map(target)\n : new Set(target)\n : undefined;\n // 在触发反应之前执行操作\n const result = target.clear();\n\n if (hadItems)\n {\n PropertyReactivity.trigger(\n target,\n TriggerOpTypes.CLEAR,\n undefined,\n undefined,\n oldTarget,\n );\n }\n\n return result;\n },\n };\n\n // 添加迭代器方法\n const iteratorMethods = [\n 'keys',\n 'values',\n 'entries',\n Symbol.iterator,\n ] as const;\n\n iteratorMethods.forEach((method) =>\n {\n instrumentations[method] = createIterableMethod(method);\n });\n\n return instrumentations;\n}\n\n/**\n * 创建迭代器方法。\n *\n * 为集合创建响应式的迭代器方法,包括:\n * 1. keys() - 返回键的迭代器\n * 2. values() - 返回值的迭代器\n * 3. entries() - 返回键值对的迭代器\n * 4. [Symbol.iterator] - 返回默认迭代器\n *\n * @param method 迭代器方法名\n * @returns 增强后的迭代器方法\n */\nfunction createIterableMethod(method: string | symbol)\n{\n return function (\n this: IterableCollections,\n ...args: unknown[]\n ): Iterable<unknown> & Iterator<unknown>\n {\n const target = this[ReactiveFlags.RAW];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair\n = method === 'entries' || (method === Symbol.iterator && targetIsMap);\n const isKeyOnly = method === 'keys' && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = toReactive;\n\n // 追踪迭代操作\n PropertyReactivity.track(\n rawTarget,\n TrackOpTypes.ITERATE,\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY,\n );\n\n // 返回一个包装的迭代器,它会返回响应式版本的值\n return {\n // 迭代器协议\n next()\n {\n const { value, done } = innerIterator.next();\n\n return done\n ? { value, done }\n : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done,\n };\n },\n // 可迭代协议\n [Symbol.iterator]()\n {\n return this;\n },\n };\n };\n}\n\n/**\n * 检查键的身份。\n *\n * 在开发模式下检查键的身份,确保不会出现重复的键。\n *\n * @param target 目标集合\n * @param has 检查方法\n * @param key 要检查的键\n */\nfunction checkIdentityKeys(\n target: CollectionTypes,\n has: (key: unknown) => boolean,\n key: unknown,\n)\n{\n const rawKey = toRaw(key);\n\n if (rawKey !== key && has.call(target, rawKey))\n {\n const type = toRawType(target);\n\n warn(\n `响应式 ${type} 同时包含同一对象的原始版本和响应式版本` +\n `${type === `Map` ? `作为键` : ``},` +\n `这可能导致不一致。` +\n `建议仅使用响应式版本。`,\n );\n }\n}\n\n/**\n * 获取对象的原型。\n *\n * @param v 目标对象\n * @returns 对象的原型\n */\nconst getProto = <T extends CollectionTypes>(v: T): any => Reflect.getPrototypeOf(v);\n\n/**\n * 集合类型。\n *\n * 包括可迭代集合和弱引用集合。\n */\ntype CollectionTypes = IterableCollections | WeakCollections;\n\n/**\n * 可迭代集合类型。\n *\n * 包括 Map 和 Set。\n */\ntype IterableCollections = (Map<any, any> | Set<any>) & Target;\n\n/**\n * 弱引用集合类型。\n *\n * 包括 WeakMap 和 WeakSet。\n */\ntype WeakCollections = (WeakMap<any, any> | WeakSet<any>) & Target;\n\n/**\n * Map 类型。\n *\n * 包括 Map 和 WeakMap。\n */\ntype MapTypes = (Map<any, any> | WeakMap<any, any>) & Target;\n\n/**\n * Set 类型。\n *\n * 包括 Set 和 WeakSet。\n */\ntype SetTypes = (Set<any> | WeakSet<any>) & Target;\n","import { mutableHandlers } from './baseHandlers';\nimport { mutableCollectionHandlers } from './collectionHandlers';\nimport { Computed } from './computed';\nimport { Ref } from './ref';\nimport { ReactiveFlags, TargetType } from './shared/constants';\nimport { getTargetType, isObject, Target } from './shared/general';\n\n/**\n * 移除对象属性中的 readonly 关键字。\n *\n * 用于将只读类型转换为可写类型。\n */\nexport type UnReadonly<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * 创建或者获取响应式对象的代理对象。\n *\n * 将普通对象转换为响应式对象,使其属性可以被追踪和更新。\n *\n * 特点:\n * 1. 支持对象和集合类型的响应式转换\n * 2. 自动处理嵌套对象的响应式转换\n * 3. 缓存已创建的代理对象\n * 4. 支持只读属性的响应式转换\n *\n * 注意:\n * 1. 扩大被反应式的对象的类型范围,只有 `Object.isExtensible` 不通过的对象不被响应化。\n * Float32Array 等都允许被响应化。\n * 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,\n * 通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。\n *\n * @param target 要转换为响应式的对象\n * @returns 响应式代理对象\n */\nexport function reactive<T extends object>(target: T): Reactive<T>\n{\n if (!isObject(target))\n {\n return target;\n }\n\n if (target[ReactiveFlags.RAW])\n {\n return target as any;\n }\n\n // 只有特定类型的值可以被观察\n const targetType = getTargetType(target);\n\n if (targetType === TargetType.INVALID)\n {\n return target as any;\n }\n\n // 如果目标已经有对应的代理对象,直接返回\n const existingProxy = reactiveMap.get(target);\n\n if (existingProxy)\n {\n return existingProxy;\n }\n\n // 创建新的代理对象\n const proxy = new Proxy<T>(\n target,\n targetType === TargetType.COLLECTION ? mutableCollectionHandlers : mutableHandlers as any,\n ) as T;\n\n reactiveMap.set(target, proxy);\n\n return proxy as any;\n}\n\n/**\n * 响应式对象缓存映射。\n *\n * 用于缓存已创建的响应式代理对象,避免重复创建。\n */\nexport const reactiveMap = new WeakMap<Target, any>();\n\n/**\n * 判断一个对象是否为响应式对象。\n *\n * 通过检查对象是否具有 IS_REACTIVE 标志来判断。\n *\n * @param value 要检查的对象\n * @returns 如果是响应式对象则返回 true,否则返回 false\n */\nexport function isReactive(value: unknown): boolean\n{\n return !!(value && (value as Target)[ReactiveFlags.IS_REACTIVE]);\n}\n\n/**\n * 转换为响应式对象。\n *\n * 如果输入是对象,则将其转换为响应式对象。\n * 如果输入不是对象,则直接返回。\n *\n * @param value 要转换的值\n * @returns 转换后的响应式对象或原值\n */\nexport const toReactive = <T>(value: T): T =>\n{\n if (isObject(value))\n {\n return reactive(value as any) as any;\n }\n\n return value;\n};\n\n/**\n * 判断一个对象是否为代理对象。\n *\n * 通过检查对象是否具有 RAW 标志来判断。\n *\n * @param value 要检查的对象\n * @returns 如果是代理对象则返回 true,否则返回 false\n */\nexport function isProxy(value: any): boolean\n{\n return value ? !!value[ReactiveFlags.RAW] : false;\n}\n\n/**\n * 响应式类型。\n *\n * 表示一个对象的所有属性都是响应式的。\n */\nexport type Reactive<T> = UnReadonly<UnwrapRefSimple<T>>;\n\n/**\n * 原始类型。\n *\n * 包括:字符串、数字、布尔值、大整数、符号、undefined、null。\n */\ntype Primitive = string | number | boolean | bigint | symbol | undefined | null;\n\n/**\n * 内置类型。\n *\n * 包括:原始类型、函数、日期、错误、正则表达式。\n */\nexport type Builtin = Primitive | Function | Date | Error | RegExp;\n\n/**\n * 用于扩展不被解包的类型。\n *\n * 可以通过声明合并来扩展此接口,添加不需要被解包的类型。\n *\n * 示例:\n * ```ts\n * declare module '@vue/reactivity' {\n * export interface RefUnwrapBailTypes {\n * runtimeDOMBailTypes: Node | Window\n * }\n * }\n * ```\n */\nexport interface RefUnwrapBailTypes { }\n\n/**\n * 解包类型。\n *\n * 递归地解包响应式对象的类型,包括:\n * 1. 内置类型直接返回\n * 2. Ref 类型解包为内部类型\n * 3. Computed 类型解包为内部类型\n * 4. 对象类型递归解包其属性\n * 5. 其他类型直接返回\n */\nexport type UnwrapRefSimple<T> =\n T extends\n | Builtin\n | Ref\n | RefUnwrapBailTypes[keyof RefUnwrapBailTypes]\n ? T :\n T extends Ref<infer TT> ? TT :\n T extends Computed<infer TT> ? TT :\n T extends object ? {\n [K in keyof T]: UnwrapRefSimple<T[K]>\n } :\n T;\n","import { Effect, effect, EffectScope } from '@feng3d/reactivity';\n\n/**\n * 响应式类基类\n *\n * 提供响应式编程的基础功能,包括:\n * 1. 提供副作用管理机制,自动管理副作用的生命周期\n * 2. 在类销毁时自动清理所有副作用,防止内存泄漏\n *\n * 使用方式:\n * ```typescript\n * class MyClass extends ReactiveObject {\n * constructor() {\n * super();\n *\n * // 创建副作用,会自动管理生命周期\n * this.effect(() => {\n * ...\n * });\n * }\n * }\n * ```\n */\nexport class ReactiveObject\n{\n constructor()\n {\n }\n\n /**\n * 副作用作用域\n *\n * 用于管理所有副作用的生命周期:\n * - 收集所有通过 effect() 方法创建的副作用\n * - 在类销毁时自动停止所有副作用\n * - 防止副作用在类销毁后继续执行,避免内存泄漏\n *\n * 私有属性,外部无法直接访问,只能通过 effect() 方法使用\n */\n private _effectScope = new EffectScope();\n\n /**\n * 销毁时需要执行的函数\n */\n private _destroyCallbacks: (() => void)[] = [];\n\n /**\n * 创建并运行副作用\n *\n * 功能:\n * 1. 将传入的函数包装为副作用\n * 2. 自动收集副作用中访问的响应式属性作为依赖\n * 3. 当依赖变化时自动重新执行副作用\n * 4. 在类销毁时自动停止副作用\n *\n * 使用场景:\n * - 监听属性变化并执行相应操作\n * - 自动更新UI或重新计算派生状态\n * - 执行清理或初始化逻辑\n *\n * @param fn 副作用函数,会在依赖变化时自动执行\n *\n * 使用示例:\n * ```typescript\n * this.effect(() => {\n * // 访问响应式属性,建立依赖关系\n * const value = reactive(this).someProperty;\n *\n * // 执行相应的逻辑\n * this.updateUI(value);\n * });\n * ```\n */\n effect(fn: () => void)\n {\n let eff: Effect;\n\n this._effectScope.run(() =>\n {\n eff = effect(fn);\n });\n\n return eff;\n }\n\n /**\n * 销毁时执行的函数\n * @param callback 销毁时执行的函数\n */\n destroyCall(callback: () => void)\n {\n this._destroyCallbacks.push(callback);\n }\n\n /**\n * 销毁响应式类实例\n *\n * 执行清理操作:\n * 1. 执行所有注册的清理函数\n * 2. 停止所有副作用作用域,防止副作用继续执行\n * 3. 清理引用,帮助垃圾回收,防止内存泄漏\n *\n * 重要:\n * - 子类重写此方法时必须调用 super.destroy()\n * - 确保在类实例不再使用时调用此方法\n * - 调用后实例将无法再使用 effect() 方法\n *\n * 使用示例:\n * ```typescript\n * class MyClass extends ReactiveObject {\n * destroy() {\n * // 执行子类特定的清理逻辑\n * this.cleanup();\n *\n * // 必须调用父类的destroy方法\n * super.destroy();\n * }\n * }\n * ```\n */\n destroy()\n {\n // 执行所有注册的清理函数\n this._destroyCallbacks?.forEach((item) => item());\n this._destroyCallbacks = null;\n\n // 停止副作用作用域,这会自动停止所有通过 effect() 创建的副作用\n this._effectScope?.stop();\n this._effectScope = null;\n }\n}"],"names":["ReactiveFlags","TargetType","TrackOpTypes","TriggerOpTypes","key","result","_a","_b"],"mappings":"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"}
|