Skip to content

Commit 280b8cb

Browse files
committed
refactor: remove getCurrentEffect, add effect flag for on
Use the effect flag to distinguish whether it is in the effect of a v-for block.
1 parent 03d1d0a commit 280b8cb

File tree

9 files changed

+32
-29
lines changed

9 files changed

+32
-29
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vOn.spec.ts.snap

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ const t0 = _template("<div></div>")
1818
1919
export function render(_ctx) {
2020
const n0 = t0()
21-
_renderEffect(() => _on(n0, _ctx.event, () => _ctx.handler))
21+
_renderEffect(() => {
22+
_on(n0, _ctx.event, () => _ctx.handler, {
23+
effect: true
24+
})
25+
})
2226
return n0
2327
}"
2428
`;
@@ -29,7 +33,11 @@ const t0 = _template("<div></div>")
2933
3034
export function render(_ctx) {
3135
const n0 = t0()
32-
_renderEffect(() => _on(n0, _ctx.event(_ctx.foo), () => _ctx.handler))
36+
_renderEffect(() => {
37+
_on(n0, _ctx.event(_ctx.foo), () => _ctx.handler, {
38+
effect: true
39+
})
40+
})
3341
return n0
3442
}"
3543
`;
@@ -40,7 +48,11 @@ const t0 = _template("<div></div>")
4048
4149
export function render(_ctx) {
4250
const n0 = t0()
43-
_renderEffect(() => _on(n0, _ctx.event, () => _ctx.handler))
51+
_renderEffect(() => {
52+
_on(n0, _ctx.event, () => _ctx.handler, {
53+
effect: true
54+
})
55+
})
4456
return n0
4557
}"
4658
`;
@@ -366,7 +378,8 @@ export function render(_ctx) {
366378
const n0 = t0()
367379
_renderEffect(() => {
368380
_on(n0, (_ctx.event) === "click" ? "mouseup" : (_ctx.event), () => _ctx.test, {
369-
modifiers: ["middle"]
381+
modifiers: ["middle"],
382+
effect: true
370383
})
371384
})
372385
return n0
@@ -396,7 +409,8 @@ export function render(_ctx) {
396409
_renderEffect(() => {
397410
_on(n0, (_ctx.event) === "click" ? "contextmenu" : (_ctx.event), () => _ctx.test, {
398411
modifiers: ["right"],
399-
keys: ["right"]
412+
keys: ["right"],
413+
effect: true
400414
})
401415
})
402416
return n0
@@ -424,7 +438,8 @@ export function render(_ctx) {
424438
_renderEffect(() => {
425439
_on(n0, _ctx.e, () => _ctx.test, {
426440
modifiers: ["left"],
427-
keys: ["left"]
441+
keys: ["left"],
442+
effect: true
428443
})
429444
})
430445
return n0

packages/compiler-vapor/src/generators/event.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export function genSetEvent(
1616
context: CodegenContext,
1717
): CodeFragment[] {
1818
const { vaporHelper, options } = context
19-
const { element, key, keyOverride, value, modifiers, delegate } = oper
19+
const { element, key, keyOverride, value, modifiers, delegate, effect } = oper
2020

2121
const name = genName()
2222
const handler = genEventHandler()
@@ -77,7 +77,7 @@ export function genSetEvent(
7777

7878
function genEventOptions(): CodeFragment[] | undefined {
7979
let { options, keys, nonKeys } = modifiers
80-
if (!options.length && !nonKeys.length && !keys.length) return
80+
if (!options.length && !nonKeys.length && !keys.length && !effect) return
8181

8282
return genMulti(
8383
[
@@ -87,6 +87,7 @@ export function genSetEvent(
8787
],
8888
!!nonKeys.length && ['modifiers: ', genArrayExpression(nonKeys)],
8989
!!keys.length && ['keys: ', genArrayExpression(keys)],
90+
effect && ['effect: true'],
9091
...options.map((option): CodeFragment[] => [`${option}: true`]),
9192
)
9293
}

packages/compiler-vapor/src/ir.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ export interface SetEventIRNode extends BaseIRNode {
116116
}
117117
keyOverride?: KeyOverride
118118
delegate: boolean
119+
/** Whether it's in effect */
120+
effect: boolean
119121
}
120122

121123
export interface SetHtmlIRNode extends BaseIRNode {

packages/compiler-vapor/src/transforms/vOn.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
7070
},
7171
keyOverride,
7272
delegate,
73+
effect: !arg.isStatic,
7374
}
7475

7576
context.registerEffect([arg], [operation])

packages/reactivity/src/baseWatch.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,6 @@ const DEFAULT_HANDLE_ERROR: HandleError = (err: unknown) => {
9898
const cleanupMap: WeakMap<ReactiveEffect, (() => void)[]> = new WeakMap()
9999
let activeEffect: ReactiveEffect | undefined = undefined
100100

101-
/**
102-
* Returns the current active effect if there is one.
103-
*/
104-
export function getCurrentEffect() {
105-
return activeEffect
106-
}
107-
108101
/**
109102
* Registers a cleanup callback on the current active effect. This
110103
* registered cleanup callback will be invoked right before the

packages/reactivity/src/effect.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export class ReactiveEffect<T = any> {
7070
public fn: () => T,
7171
public trigger: () => void,
7272
public scheduler?: EffectScheduler,
73-
public scope?: EffectScope,
73+
scope?: EffectScope,
7474
) {
7575
recordEffectScope(this, scope)
7676
}

packages/reactivity/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ export {
7272
export { TrackOpTypes, TriggerOpTypes, ReactiveFlags } from './constants'
7373
export {
7474
baseWatch,
75-
getCurrentEffect,
7675
onEffectCleanup,
7776
traverse,
7877
BaseWatchErrorCodes,

packages/runtime-vapor/src/dom/event.ts

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
getCurrentEffect,
32
getCurrentScope,
43
onEffectCleanup,
54
onScopeDispose,
@@ -27,25 +26,19 @@ export function on(
2726
el: HTMLElement,
2827
event: string,
2928
handlerGetter: () => undefined | ((...args: any[]) => any),
30-
options: AddEventListenerOptions & ModifierOptions = {},
29+
options: AddEventListenerOptions &
30+
ModifierOptions & { effect?: boolean } = {},
3131
) {
3232
const handler: DelegatedHandler = eventHandler(handlerGetter, options)
3333
const cleanupMetadata = recordEventMetadata(el, event, handler)
34-
3534
let cleanupEvent: (() => void) | undefined
3635
queuePostRenderEffect(() => {
3736
cleanupEvent = addEventListener(el, event, handler, options)
3837
})
3938

40-
const scope = getCurrentScope()
41-
const effect = getCurrentEffect()
42-
// If we are in an effect and the effect has the same scope as
43-
// the current scope, we can cleanup when the effect is disposed
44-
// This solves the issue where createFor itself has an effect,
45-
// but this effect is unrelated to its block.
46-
if (effect && effect.scope === scope) {
39+
if (options.effect) {
4740
onEffectCleanup(cleanup)
48-
} else if (scope) {
41+
} else if (getCurrentScope()) {
4942
onScopeDispose(cleanup)
5043
}
5144

packages/runtime-vapor/src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export {
2929
// effect
3030
stop,
3131
ReactiveEffect,
32-
getCurrentEffect,
3332
onEffectCleanup,
3433
// effect scope
3534
effectScope,

0 commit comments

Comments
 (0)