From 1f50ab1c847f825f9f0f1f67f60fcd7ba8a4a301 Mon Sep 17 00:00:00 2001 From: dj Date: Tue, 10 Feb 2026 17:54:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(effects):=20=E6=B7=BB=E5=8A=A0=20scheduler?= =?UTF-8?q?=20=E9=80=89=E9=A1=B9=E6=94=AF=E6=8C=81=E5=92=8C=20extend=20?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 extend 函数作为 Object.assign 的别名 - 修复 ReactiveEffectOptions 中 scheduler 属性拼写错误 - 实现 effect 选项配置的属性扩展功能 - 更新 lazy 示例展示 effect 运行逻辑 - 新增 scheduler 示例演示调度器功能 --- packages/reactivity/src/effect.ts | 8 +++-- packages/shared/src/index.ts | 2 ++ packages/vue/examples/reactivity/lazy.html | 16 +++++----- .../vue/examples/reactivity/scheduler.html | 30 +++++++++++++++++++ 4 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 packages/vue/examples/reactivity/scheduler.html diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index c7f39ac..bf3a5fd 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -1,5 +1,5 @@ import { createDep, Dep } from './dep' -import { isArray } from '@vue/shared' +import { extend, isArray } from '@vue/shared' import { ComputedRefImpl } from './computed' export type EffectScheduler = (...args: any[]) => any @@ -15,10 +15,14 @@ const targetMap = new WeakMap() export interface ReactiveEffectOptions { lazy?: boolean - schedler?: EffectScheduler + scheduler?: EffectScheduler } export function effect(fn: () => T, options?: ReactiveEffectOptions) { const _effect = new ReactiveEffect(fn) + if (options) { + extend(_effect, options) + } + if (!options || !options.lazy) { _effect.run() } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 97d9207..5494e3b 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -13,3 +13,5 @@ export const hasChanged = (value: any, oldValue: any): boolean => export const isFunction = (val: unknown): val is Function => { return typeof val === 'function' } + +export const extend = Object.assign diff --git a/packages/vue/examples/reactivity/lazy.html b/packages/vue/examples/reactivity/lazy.html index 13e5a54..56c475d 100644 --- a/packages/vue/examples/reactivity/lazy.html +++ b/packages/vue/examples/reactivity/lazy.html @@ -13,16 +13,14 @@ const obj=reactive({ count:1 }) - let {name}=obj - console.log('name',name); - + effect(()=>{ - document.querySelector('#app').innerText=name + console.log('obj.count',obj.count) + },{ + lazy:false }) - setTimeout(()=>{ - obj.name='李四' - - console.log('obj',obj); - },2000) + obj.count=2 + + console.log('代码运行结束'); \ No newline at end of file diff --git a/packages/vue/examples/reactivity/scheduler.html b/packages/vue/examples/reactivity/scheduler.html new file mode 100644 index 0000000..e26dec5 --- /dev/null +++ b/packages/vue/examples/reactivity/scheduler.html @@ -0,0 +1,30 @@ + + + + + Document + + + +
+ + + \ No newline at end of file