feat(runtime-core): support using inject() inside props default functions

This commit is contained in:
Evan You 2020-09-17 15:59:01 -04:00
parent 985bd2bcb5
commit 58c31e3699
2 changed files with 46 additions and 10 deletions

View File

@ -8,7 +8,9 @@ import {
defineComponent,
ref,
serializeInner,
createApp
createApp,
provide,
inject
} from '@vue/runtime-test'
import { render as domRender, nextTick } from 'vue'
@ -212,6 +214,32 @@ describe('component props', () => {
expect(defaultFn).toHaveBeenCalledTimes(1)
})
test('using inject in default value factory', () => {
const Child = defineComponent({
props: {
test: {
default: () => inject('test', 'default')
}
},
setup(props) {
return () => {
return h('div', props.test)
}
}
})
const Comp = {
setup() {
provide('test', 'injected')
return () => h(Child)
}
}
const root = nodeOps.createElement('div')
render(h(Comp), root)
expect(serializeInner(root)).toBe(`<div>injected</div>`)
})
test('optimized props updates', async () => {
const Child = defineComponent({
props: ['foo'],

View File

@ -27,7 +27,8 @@ import {
Data,
ComponentInternalInstance,
ComponentOptions,
ConcreteComponent
ConcreteComponent,
setCurrentInstance
} from './component'
import { isEmitListener } from './componentEmits'
import { InternalObjectKey } from './vnode'
@ -179,7 +180,8 @@ export function updateProps(
options,
rawCurrentProps,
camelizedKey,
value
value,
instance
)
}
} else {
@ -214,7 +216,8 @@ export function updateProps(
options,
rawProps || EMPTY_OBJ,
key,
undefined
undefined,
instance
)
}
} else {
@ -277,7 +280,8 @@ function setFullProps(
options!,
rawCurrentProps,
key,
rawCurrentProps[key]
rawCurrentProps[key],
instance
)
}
}
@ -287,7 +291,8 @@ function resolvePropValue(
options: NormalizedProps,
props: Data,
key: string,
value: unknown
value: unknown,
instance: ComponentInternalInstance
) {
const opt = options[key]
if (opt != null) {
@ -295,10 +300,13 @@ function resolvePropValue(
// default values
if (hasDefault && value === undefined) {
const defaultValue = opt.default
value =
opt.type !== Function && isFunction(defaultValue)
? defaultValue(props)
: defaultValue
if (opt.type !== Function && isFunction(defaultValue)) {
setCurrentInstance(instance)
value = defaultValue(props)
setCurrentInstance(null)
} else {
value = defaultValue
}
}
// boolean casting
if (opt[BooleanFlags.shouldCast]) {