]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): fix component proxy props presence check
authorEvan You <yyx990803@gmail.com>
Sat, 21 Mar 2020 20:25:33 +0000 (16:25 -0400)
committerEvan You <yyx990803@gmail.com>
Sat, 21 Mar 2020 20:25:33 +0000 (16:25 -0400)
fix #864

packages/runtime-core/__tests__/componentProxy.spec.ts
packages/runtime-core/src/componentProps.ts
packages/runtime-core/src/componentProxy.ts

index 8ea2ace2079e7171ef4d1fbebd6cb98609de7db8..ee8f2bc75d57e6fd4f6e1884cc7b59ba624a89f9 100644 (file)
@@ -175,4 +175,18 @@ describe('component: proxy', () => {
     instanceProxy.baz = 1
     expect('baz' in instanceProxy).toBe(true)
   })
+
+  // #864
+  test('should not warn declared but absent props', () => {
+    const Comp = {
+      props: ['test'],
+      render(this: any) {
+        return this.test
+      }
+    }
+    render(h(Comp), nodeOps.createElement('div'))
+    expect(
+      `was accessed during render but is not defined`
+    ).not.toHaveBeenWarned()
+  })
 })
index 0e55d022686df6e7d6acc98ccc8e15d4c0f4702c..f9de525c87d64d8a68ebc1ac81e69f6a75705c41 100644 (file)
@@ -12,7 +12,8 @@ import {
   toRawType,
   PatchFlags,
   makeMap,
-  isReservedProp
+  isReservedProp,
+  EMPTY_ARR
 } from '@vue/shared'
 import { warn } from './warning'
 import { Data, ComponentInternalInstance } from './component'
@@ -216,11 +217,11 @@ function validatePropName(key: string) {
   return false
 }
 
-function normalizePropsOptions(
+export function normalizePropsOptions(
   raw: ComponentPropsOptions | void
 ): NormalizedPropsOptions {
   if (!raw) {
-    return [] as any
+    return EMPTY_ARR as any
   }
   if (normalizationMap.has(raw)) {
     return normalizationMap.get(raw)!
index eb496f658d2f4322e3795ab1b58066fefc9b7931..442f3f32af0cbad78f42a0493b53035e5286f2e6 100644 (file)
@@ -15,6 +15,7 @@ import {
   currentRenderingInstance,
   markAttrsAccessed
 } from './componentRenderUtils'
+import { normalizePropsOptions } from './componentProps'
 
 // public properties exposed on the proxy, which is used as the render context
 // in templates (as `this` in the render option)
@@ -75,15 +76,7 @@ const enum AccessTypes {
 
 export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
   get(target: ComponentInternalInstance, key: string) {
-    const {
-      renderContext,
-      data,
-      props,
-      propsProxy,
-      accessCache,
-      type,
-      sink
-    } = target
+    const { renderContext, data, propsProxy, accessCache, type, sink } = target
 
     // data / props / renderContext
     // This getter gets called for every property access on the render context
@@ -110,9 +103,9 @@ export const PublicInstanceProxyHandlers: ProxyHandler<any> = {
         accessCache![key] = AccessTypes.CONTEXT
         return renderContext[key]
       } else if (type.props) {
-        // only cache other properties when instance has declared (this stable)
+        // only cache other properties when instance has declared (thus stable)
         // props
-        if (hasOwn(props, key)) {
+        if (hasOwn(normalizePropsOptions(type.props)[0], key)) {
           accessCache![key] = AccessTypes.PROPS
           // return the value from propsProxy for ref unwrapping and readonly
           return propsProxy![key]