Skip to content

Commit

Permalink
feat(runtime-core): support using inject() inside props default funct…
Browse files Browse the repository at this point in the history
…ions
  • Loading branch information
yyx990803 committed Sep 17, 2020
1 parent 985bd2b commit 58c31e3
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 10 deletions.
30 changes: 29 additions & 1 deletion packages/runtime-core/__tests__/componentProps.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@ import {
defineComponent,
ref,
serializeInner,
createApp
createApp,
provide,
inject
} from '@vue/runtime-test'
import { render as domRender, nextTick } from 'vue'

Expand Down Expand Up @@ -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'],
Expand Down
26 changes: 17 additions & 9 deletions packages/runtime-core/src/componentProps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ import {
Data,
ComponentInternalInstance,
ComponentOptions,
ConcreteComponent
ConcreteComponent,
setCurrentInstance
} from './component'
import { isEmitListener } from './componentEmits'
import { InternalObjectKey } from './vnode'
Expand Down Expand Up @@ -179,7 +180,8 @@ export function updateProps(
options,
rawCurrentProps,
camelizedKey,
value
value,
instance
)
}
} else {
Expand Down Expand Up @@ -214,7 +216,8 @@ export function updateProps(
options,
rawProps || EMPTY_OBJ,
key,
undefined
undefined,
instance
)
}
} else {
Expand Down Expand Up @@ -277,7 +280,8 @@ function setFullProps(
options!,
rawCurrentProps,
key,
rawCurrentProps[key]
rawCurrentProps[key],
instance
)
}
}
Expand All @@ -287,18 +291,22 @@ function resolvePropValue(
options: NormalizedProps,
props: Data,
key: string,
value: unknown
value: unknown,
instance: ComponentInternalInstance
) {
const opt = options[key]
if (opt != null) {
const hasDefault = hasOwn(opt, 'default')
// 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]) {
Expand Down

0 comments on commit 58c31e3

Please sign in to comment.