Vue3的provide和inject

provideinject用于实现祖组件与其后代组件(如子组件、孙组件、重孙组件等等)间的通信,有点像Vue2时的事件总线。

具体看个例子吧。项目目录如下。
在这里插入图片描述

  • main.js
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')
  • 祖组件App.vue
<template>
    <div class="app">
      <h2>我是祖组件,{{car.brand}}:{{car.price}}</h2>
      <Son/>
    </div>
</template>

<script>
import { reactive,provide} from 'vue';
import Son from "./components/Son.vue";

export default {
  name:"App",
  components:{
    Son
  },
  setup(){
    let car = reactive({
      brand:"BYD",
      price:"30W"
    })
    provide('theCar',car);
    return {
      car
    }
  }

}
</script>

<style>
.app{
  background: gray;
  padding: 10px;
}
</style>
  • 子组件components/Son.vue
<template>
    <div class="son">
        <h2>我是儿子组件</h2>
        <Grandson/>
    </div>
</template>

<script>
import Grandson from "./Grandson.vue";

export default {
  name:"Son",
  components:{
    Grandson
  }

}
</script>

<style scoped>
.son{
  background: skyblue;
  padding: 10px;
}

</style>
  • 孙组件components/Grandson.vue
<template>
    <div class="grandson">
        <h2>我是孙子组件,{{aCar.brand}}:{{aCar.price}}</h2>
    </div>
</template>

<script>
import {inject} from "vue";

export default {
  name:"Grandson",
  setup(){
      let aCar = inject("theCar");
      console.log(aCar);

      return {
          aCar
      }
  }

}
</script>

<style scoped>
.grandson{
  background:orange;
  padding: 10px;
}

</style>
  • 启动应用,测试效果
    在这里插入图片描述
    在这里插入图片描述
    祖组件App.vue通过provide提供数据theCar。
    孙组件Grandson.vue通过inject注入数据,从而得到theCar。
    当然,祖组件App.vue、子组件Son.vue,也可以通过provide+inject的方式进行通信,不过通常我们不会这么做,而是通过props
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值