fix(runtime-core): bind default function of inject to instance (#3925)
fix #3923
This commit is contained in:
parent
bc100c5c48
commit
db1dc1c630
@ -7,7 +7,8 @@ import {
|
||||
nextTick,
|
||||
Ref,
|
||||
readonly,
|
||||
reactive
|
||||
reactive,
|
||||
defineComponent
|
||||
} from '../src/index'
|
||||
import { render, nodeOps, serialize } from '@vue/runtime-test'
|
||||
|
||||
@ -91,6 +92,34 @@ describe('api: provide/inject', () => {
|
||||
expect(serialize(root)).toBe(`<div>foobar</div>`)
|
||||
})
|
||||
|
||||
it('bound to instance', () => {
|
||||
const Provider = {
|
||||
setup() {
|
||||
return () => h(Consumer)
|
||||
}
|
||||
}
|
||||
|
||||
const Consumer = defineComponent({
|
||||
name: 'Consumer',
|
||||
inject: {
|
||||
foo: {
|
||||
from: 'foo',
|
||||
default() {
|
||||
return this!.$options.name
|
||||
}
|
||||
}
|
||||
},
|
||||
render() {
|
||||
// @ts-ignore
|
||||
return this.foo
|
||||
}
|
||||
})
|
||||
|
||||
const root = nodeOps.createElement('div')
|
||||
render(h(Provider), root)
|
||||
expect(serialize(root)).toBe(`<div>Consumer</div>`)
|
||||
})
|
||||
|
||||
it('nested providers', () => {
|
||||
const ProviderOne = {
|
||||
setup() {
|
||||
|
@ -60,7 +60,7 @@ export function inject(
|
||||
return provides[key as string]
|
||||
} else if (arguments.length > 1) {
|
||||
return treatDefaultAsFactory && isFunction(defaultValue)
|
||||
? defaultValue()
|
||||
? defaultValue.call(instance.proxy)
|
||||
: defaultValue
|
||||
} else if (__DEV__) {
|
||||
warn(`injection "${String(key)}" not found.`)
|
||||
|
Loading…
Reference in New Issue
Block a user