From bfd6744fb1db36a02914ef48da7116636343f313 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 16 Apr 2020 10:39:51 -0400 Subject: [PATCH] perf(runtime-core): use raw context on component options init --- packages/runtime-core/__tests__/apiOptions.spec.ts | 2 +- packages/runtime-core/src/componentOptions.ts | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts index 836373c7053..65115804ad4 100644 --- a/packages/runtime-core/__tests__/apiOptions.spec.ts +++ b/packages/runtime-core/__tests__/apiOptions.spec.ts @@ -627,7 +627,7 @@ describe('api: options', () => { render(h(Comp), root) instance.foo = 1 expect( - 'Computed property "foo" was assigned to but it has no setter.' + 'Write operation failed: computed property "foo" is readonly' ).toHaveBeenWarned() }) diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 31bb01ad0ef..20c99a717ed 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -40,7 +40,8 @@ import { reactive, ComputedGetter, WritableComputedOptions, - ComputedRef + ComputedRef, + toRaw } from '@vue/reactivity' import { ComponentObjectPropsOptions, @@ -276,11 +277,12 @@ export function applyOptions( errorCaptured } = options - const renderContext = + const renderContext = toRaw( instance.renderContext === EMPTY_OBJ && (computedOptions || methods || watchOptions || injectOptions) ? (instance.renderContext = reactive({})) : instance.renderContext + ) const globalMixins = instance.appContext.mixins // call it only during dev @@ -355,7 +357,7 @@ export function applyOptions( : __DEV__ ? () => { warn( - `Computed property "${key}" was assigned to but it has no setter.` + `Write operation failed: computed property "${key}" is readonly.` ) } : NOOP @@ -369,7 +371,9 @@ export function applyOptions( if (renderContext[key] && !(key in proxyTarget)) { Object.defineProperty(proxyTarget, key, { enumerable: true, - get: () => (renderContext[key] as ComputedRef).value + configurable: true, + get: () => (renderContext[key] as ComputedRef).value, + set: NOOP }) } }