diff --git a/packages/runtime-core/__tests__/componentProps.spec.ts b/packages/runtime-core/__tests__/componentProps.spec.ts
index d0ddc5c1fdc..f75d3c2ebbd 100644
--- a/packages/runtime-core/__tests__/componentProps.spec.ts
+++ b/packages/runtime-core/__tests__/componentProps.spec.ts
@@ -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(`
injected
`)
+ })
+
test('optimized props updates', async () => {
const Child = defineComponent({
props: ['foo'],
diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts
index 0fde127a28f..f977099d806 100644
--- a/packages/runtime-core/src/componentProps.ts
+++ b/packages/runtime-core/src/componentProps.ts
@@ -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]) {