vue 依赖注入 provide/inject 实战

14 篇文章 0 订阅
14 篇文章 0 订阅

官网描述是:

provide 选项允许我们指定我们想要提供给后代组件的数据/方法。在这个例子中,就是 <google-map> 内部的 getMap 方法:

provide: function () {
  return {
    getMap: this.getMap
  }
}

然后在任何后代组件里,我们都可以使用 inject 选项来接收指定的我们想要添加在这个实例上的属性:

inject: ['getMap']

不知道 是本人网络原因还是怎样,完整的示例 竟然打不开。还是自己动手亲测吧。

 

首先建立provideTest.vue,作为父组件,内部定义provide:

<template>

<div>

<p>{{msg}}</p>

<p>provideTest</p>

 

<InjectTest>

 

</InjectTest>

 

</div>

</template>

<script>

import InjectTest from '@/components/injectTest/injectTest.vue';

export default {

components: {

InjectTest

},

data () {

return {

msg: 'test0',

msga: 'testa'

}

},

provide: function () {

return {

getmsg: function(){

console.log('我是来自父组件的getmsg方法',this.msga);

console.log('我是来自父组件的getmsg方法',this.msg);

},

msg:this.msg

}

},

methods: {

},

created() {

}

}

</script>

 

 

然后 建立injectTest.vue,作为子组件:

 

<template>

<div>

<p>{{msg}}</p>

<p>provideTest</p>

 

<InjectTest>

 

</InjectTest>

 

</div>

</template>

<script>

import InjectTest from '@/components/injectTest/injectTest.vue';

export default {

components: {

InjectTest

},

data () {

return {

msg: 'test0',

msga: 'testa'

}

},

provide: function () {

return {

getmsg: function(){

console.log('我是来自父组件的getmsg方法',this.msga);

},

msg:this.msg

}

},

methods: {

},

created() {

}

}

</script>

 

父组件引入子组件的地址根据实际相对地址而定。

访问父组件 provideTest ,他的子组件 injectTest 也被加载执行,injectTest中 通过 inject: ['getmsg','msg'],  注入了 父组件中的 getmsg方法和msg对象。

在injectTest中 执行getmsg ,可以看出,父组件中定义了testa,当前组件中没有testa,所以console.log('我是来自父组件的getmsg方法',this.msga); 输出的 是undefined。

console.log('我是来自父组件的getmsg方法',this.msg); 输出的是 test1,是因为当前injectTest,data中定义了msg: 'test1',

总结

1、父组件通过provide定义可以注入到子组件中的对象和方法。

2、子组件通过inject注入父组件provide定义的对象和方法。

3、子组件调用inject注入的对象和方法时,上下文为当前组件。

4、如果inject中对象名和当前组件data中的对象重名,会被当前组件中定义的对象而覆盖。

5、inject中的方法名不可以和当前组件中的data、methods重名,不然会报错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值