# [Vue] Provide 與 Inject ###### tags: `Vue` * 跨越層級的資料傳遞方式 * 父元件使用 `provide(key, value)` 提供資料,其所有後代元件都可以透過 `inject(key)` 取得資料 * `inject` 可帶第二個參數設定預設值,若在祖先元件中找不到指定的 `key`,則會使用預設值 * 適合在小專案或是小區塊的功能開發上使用 * 大型專案仍建議以 Pinia 或 Vuex 為主,Provide / inject 為輔 ## 寫法 ### Vue 3 #### 使用 `<script setup>` ```javascript // 父元件 import { provide, ref } from 'vue'; const foo = ref('foo'); provide('foo', foo); ``` ```javascript // 後代元件 import { inject } from 'vue'; const parentFoo = inject('foo', 'default value'); ``` #### 使用 `<script>` ```javascript // 父元件 import { provide, ref } from 'vue'; export default { setup() { const foo = ref('foo'); provide('foo', foo); }, }; ``` ```javascript // 後代元件 import { inject } from 'vue'; export default { setup() { const parentFoo = inject('foo', 'default value'); }, }; ``` #### 使用 Options API * `provide` 提供的資料不會隨父層資料的更新而改變,若希望透過 `inject` 取回的資料能保有響應性,要使用 `computed()` ```javascript // 父元件 import { computed } from 'vue'; export default { data() { return { message: 'Hello', }; }, provide() { return { message: computed(() => this.message), }; }, }; ``` ## 參考資料 * [Vue 3 官方文件:Provide / Inject](https://vuejs.org/guide/components/provide-inject.html) * [許國政(Kuro),《重新認識 Vue.js: 008 天絕對看不完的 Vue.js 3 指南》(博碩文化,2021),第2-2章。](https://www.drmaster.com.tw/bookinfo.asp?BookID=MP22026) --- :::info 建立日期:2024-03-05 更新日期:2024-03-05 :::