fix(runtime-core): should not cache property access during data() invocation (#3299)
fix #3297
This commit is contained in:
@@ -465,7 +465,7 @@ function createDuplicateChecker() {
|
||||
|
||||
type DataFn = (vm: ComponentPublicInstance) => any
|
||||
|
||||
export let isInBeforeCreate = false
|
||||
export let shouldCacheAccess = true
|
||||
|
||||
export function applyOptions(
|
||||
instance: ComponentInternalInstance,
|
||||
@@ -518,7 +518,7 @@ export function applyOptions(
|
||||
|
||||
// applyOptions is called non-as-mixin once per instance
|
||||
if (!asMixin) {
|
||||
isInBeforeCreate = true
|
||||
shouldCacheAccess = false
|
||||
callSyncHook(
|
||||
'beforeCreate',
|
||||
LifecycleHooks.BEFORE_CREATE,
|
||||
@@ -526,7 +526,7 @@ export function applyOptions(
|
||||
instance,
|
||||
globalMixins
|
||||
)
|
||||
isInBeforeCreate = false
|
||||
shouldCacheAccess = true
|
||||
// global mixins are applied first
|
||||
applyMixins(
|
||||
instance,
|
||||
@@ -893,7 +893,9 @@ function resolveData(
|
||||
`Plain object usage is no longer supported.`
|
||||
)
|
||||
}
|
||||
shouldCacheAccess = false
|
||||
const data = dataFn.call(publicThis, publicThis)
|
||||
shouldCacheAccess = true
|
||||
if (__DEV__ && isPromise(data)) {
|
||||
warn(
|
||||
`data() returned a Promise - note data() cannot be async; If you ` +
|
||||
|
||||
@@ -31,7 +31,7 @@ import {
|
||||
OptionTypesType,
|
||||
OptionTypesKeys,
|
||||
resolveMergedOptions,
|
||||
isInBeforeCreate
|
||||
shouldCacheAccess
|
||||
} from './componentOptions'
|
||||
import { EmitsOptions, EmitFn } from './componentEmits'
|
||||
import { Slots } from './componentSlots'
|
||||
@@ -305,7 +305,7 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
|
||||
} else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {
|
||||
accessCache![key] = AccessTypes.CONTEXT
|
||||
return ctx[key]
|
||||
} else if (!__FEATURE_OPTIONS_API__ || !isInBeforeCreate) {
|
||||
} else if (!__FEATURE_OPTIONS_API__ || shouldCacheAccess) {
|
||||
accessCache![key] = AccessTypes.OTHER
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user