Vue 提供或注入

Vue 中的 Provide/Injecte(提供或注入)用于将数据从一个组件提供给其他组件,尤其是在大型项目中。

Provide(提供)使数据可用于其他组件。

Inject(注入)用于获取所提供的数据。

Provide/Inject (提供或注入)是一种共享数据的方式,可以替代使用道具传递数据。


Provide/Inject

在一个大型项目中,组件内部有组件,很难使用 props 将数据从 "App.vue" 提供给子组件,因为它需要在数据通过的每个组件中定义 props

如果我们使用 provide/inject 而不是 props,那么我们只需要在提供数据的地方定义提供的数据,并且只需要在注入的地方定义注入的数据。


Provide Data(提供数据)

我们使用 "Provide" 配置选项使数据可用于其他组件:

App.vue:

  1. <template>
  2. <h1>Food</h1>
  3. <div @click="this.activeComp = 'food-about'" class="divBtn">About</div>
  4. <div @click="this.activeComp = 'food-kinds'" class="divBtn">Kinds</div>
  5. <div id="divComp">
  6. <component :is="activeComp"></component>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. data() {
  12. return {
  13. activeComp: 'food-about',
  14. foods: [
  15. { name: 'Pizza', imgUrl: '/img_pizza.svg' },
  16. { name: 'Apple', imgUrl: '/img_apple.svg' },
  17. { name: 'Cake', imgUrl: '/img_cake.svg' },
  18. { name: 'Fish', imgUrl: '/img_fish.svg' },
  19. { name: 'Rice', imgUrl: '/img_rice.svg' }
  20. ]
  21. }
  22. },
  23. provide() {
  24. return {
  25. foods: this.foods
  26. }
  27. }
  28. }
  29. </script>

Inject Data(注入数据)

既然 'foods' 数组是由 'App.vue' 中的 'provide' 提供的,我们可以将其包含在 'FoodKinds' 组件中。

通过将 'foods' 数据注入 'FoodKinds' 组件,我们可以使用 'App.vue' 中的数据在 'FoodKinds' 组件中显示不同的食物:

实例

FoodKinds.vue:

  1. <template>
  2. <h2>Different Kinds of Food</h2>
  3. <p><mark>In this application, food data is provided in "App.vue", and injected in the "FoodKinds.vue" component so that it can be shown here:</mark></p>
  4. <div v-for="x in foods">
  5. <img :src="x.imgUrl">
  6. <p class="pName">{{ x.name }}</p>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. inject: ['foods']
  12. }
  13. </script>
  14. <style scoped>
  15. div {
  16. margin: 10px;
  17. padding: 10px;
  18. display: inline-block;
  19. width: 80px;
  20. background-color: #28e49f47;
  21. border-radius: 10px;
  22. }
  23. .pName {
  24. text-align: center;
  25. }
  26. img {
  27. width: 100%;
  28. }
  29. </style>