fix(ssr): make computed inactive during ssr, fix memory leak

fix #5208
This commit is contained in:
Evan You
2022-01-16 18:22:18 +08:00
parent 4d07ed809c
commit f4f0966b33
3 changed files with 15 additions and 5 deletions

View File

@@ -36,7 +36,8 @@ class ComputedRefImpl<T> {
constructor(
getter: ComputedGetter<T>,
private readonly _setter: ComputedSetter<T>,
isReadonly: boolean
isReadonly: boolean,
isSSR: boolean
) {
this.effect = new ReactiveEffect(getter, () => {
if (!this._dirty) {
@@ -44,6 +45,7 @@ class ComputedRefImpl<T> {
triggerRefValue(this)
}
})
this.effect.active = !isSSR
this[ReactiveFlags.IS_READONLY] = isReadonly
}
@@ -73,7 +75,8 @@ export function computed<T>(
): WritableComputedRef<T>
export function computed<T>(
getterOrOptions: ComputedGetter<T> | WritableComputedOptions<T>,
debugOptions?: DebuggerOptions
debugOptions?: DebuggerOptions,
isSSR = false
) {
let getter: ComputedGetter<T>
let setter: ComputedSetter<T>
@@ -91,9 +94,9 @@ export function computed<T>(
setter = getterOrOptions.set
}
const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter)
const cRef = new ComputedRefImpl(getter, setter, onlyGetter || !setter, isSSR)
if (__DEV__ && debugOptions) {
if (__DEV__ && debugOptions && !isSSR) {
cRef.effect.onTrack = debugOptions.onTrack
cRef.effect.onTrigger = debugOptions.onTrigger
}