Skip to content

Commit

Permalink
fix(runtime-core): fix component proxy props presence check
Browse files Browse the repository at this point in the history
fix #864
  • Loading branch information
yyx990803 committed Mar 21, 2020
1 parent c3bb316 commit b3890a9
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
14 changes: 14 additions & 0 deletions packages/runtime-core/__tests__/componentProxy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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()
})
})
7 changes: 4 additions & 3 deletions packages/runtime-core/src/componentProps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import {
toRawType,
PatchFlags,
makeMap,
isReservedProp
isReservedProp,
EMPTY_ARR
} from '@vue/shared'
import { warn } from './warning'
import { Data, ComponentInternalInstance } from './component'
Expand Down Expand Up @@ -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)!
Expand Down
15 changes: 4 additions & 11 deletions packages/runtime-core/src/componentProxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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]
Expand Down

0 comments on commit b3890a9

Please sign in to comment.