[Part 3 ] Vue.js 的精随-元件 provide/inject

利用 provide & inject 机制,父元件当作所有其子元件的 provider,无论所属的子元件有多深!

  • 父元件利用 provide option 提供资料
    • 要传递的资料使用 provide 定义
  • 子/孙元件利用 inject option 去使用资料

假设有一个这样的层级:

Root
└─ TodoList
   ├─ TodoItem
   └─ TodoListFooter
      ├─ ClearTodosButton
      └─ TodoListStatistics

要从todo-items传值给 TodoListStatistics ,可以利用先前介绍的 props 一层一层往下传
TodoList -> TodoListFooter -> TodoListStatistics 千万不要

这样的情境可以利用 provide/inject

const app = Vue.createApp({})

app.component('todo-list', {
  data() {
    return {
      todos: ['Feed a cat', 'Buy tickets']
    }
  },
  provide: {
    user: 'John Doe'
  },
  template: `
    <div>
      {{ todos.length }}
      <!-- rest of the template -->
    </div>
  `
})

app.component('todo-list-statistics', {
  inject: ['user'],
  created() {
    console.log(`Injected property: ${this.user}`) // Injected 的属性: John Doe
  }
})

但但但,无法传递实体元件的属性,如以下例子
ex:

app.component('todo-list', {
  data() {
    return {
      todos: ['Feed a cat', 'Buy tickets']
    }
  },
  provide: {
    todoLength: this.todos.length // 会报错 `Cannot read property 'length' of undefined` 
    // 无法取得 data 中的 todos
  },
  template: `
    ...
  `
})

如果要取得实体元件中的属性,必须将 provide 转成 function 并回传物件

ex:

app.component('todo-list', {
  data() {
    return {
      todos: ['Feed a cat', 'Buy tickets']
    }
  },
  // function 形式
  provide() {
    // 回传物件
    return {
      todoLength: this.todos.length
    }
  },
  template: `
    ...
  `
})

补充

有关跨层级传递,往後还会介绍(?!)

  • mitt
  • Vuex
  • Vue Composition API

下篇预告

  • Slots

每日一句:
每天都在跟时间赛跑 /images/emoticon/emoticon33.gif


<<:  [Day23]C# 鸡础观念- 物件导向(oop)~属性(Property)

>>:  Progressive Web App 离线後备页面: 玩过 Chrome 小恐龙游戏了吗 (11)

从 IT 技术面细说 Search Console 的 27 组数字 KPI (20) :KPI 总表,从历史说起

在之前有说到为甚麽会有这张去 Monitor SEO 的数字总表,一开始只是要记录一个简单的事:平均...

[VSCodeVim] Vim的基本操作、模式与状态列

Vim的基本操作、模式与状态列 [系列文目录] 在使用Vim之前,让我们来认识一下Vim的模式(Mo...

AE极光制作1-Day7

终於来到第二个练习了! 练习范例:https://www.sixvfx.com/northern_l...

【Day29】修改 Proxy 的方法

今天要来分享之前实习开发 QA Bot, LUIS Bot 设定 proxy 的地方。 QnA Ma...

Day 28 - 用 canvas 与 pdfjs 做文件签名(上)

前述 今天用前面做过的小画家相似功能,来完成一个可以在文件上面签名的功能~ 当然也会有新的东西可以玩...