最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue中的provide與inject用法詳解

 更新時間:2025年11月20日 10:21:47   作者:fmk1023  
provide 與 inject 是 Vue 提供的跨組件通信方案,用于解決多層級組件(父子、祖孫、更深層級)之間的數(shù)據(jù)傳遞問題,本文給大家介紹Vue中的provide與inject用法,感興趣的朋友跟隨小編一起看看吧

provide 與 inject 核心功能

provideinject 是 Vue 提供的跨組件通信方案,用于解決多層級組件(父子、祖孫、更深層級)之間的數(shù)據(jù)傳遞問題。其核心功能是:

  • provide:在父組件(或祖先組件)中定義需要共享的數(shù)據(jù)或方法,作為“提供者”。
  • inject:在子組件(或后代組件)中聲明需要接收的數(shù)據(jù)或方法,作為“消費者”。
  • 特點:無需通過 props 逐級傳遞(避免“props 鉆取”),直接跨層級通信,且不受層級深度限制。

Vue2 中的用法

Vue2 中 provideinject 以組件選項(Options API)的形式使用。

1. 基本用法

  • 父組件(提供者):通過 provide 選項定義需要共享的數(shù)據(jù)(對象或返回對象的函數(shù))。
  • 子組件(消費者):通過 inject 選項聲明需要注入的數(shù)據(jù)(字符串數(shù)組或配置對象)。

示例:

<!-- 父組件(Grandparent.vue) -->
<template>
  <div>父組件</div>
  <Parent />
</template>
<script>
import Parent from './Parent.vue'
export default {
  components: { Parent },
  // provide 可以是對象或函數(shù)(函數(shù)更靈活,可訪問 this)
  provide() {
    return {
      theme: 'dark', // 非響應式數(shù)據(jù)
      user: this.currentUser // 可傳遞組件內數(shù)據(jù)(需注意響應式)
    }
  },
  data() {
    return {
      currentUser: { name: '張三' }
    }
  }
}
</script>
<!-- 子組件(Child.vue,層級:Grandparent -> Parent -> Child) -->
<template>
  <div>
    主題:{{ theme }}
    用戶名:{{ user.name }}
  </div>
</template>
<script>
export default {
  // inject 可以是字符串數(shù)組(直接指定 key)
  // inject: ['theme', 'user']
  // 也可以是對象(支持默認值、重命名)
  inject: {
    theme: {
      from: 'theme', // 對應 provide 的 key(可選,默認與屬性名一致)
      default: 'light' // 未提供時的默認值
    },
    userName: {
      from: 'user', // 注入 user 數(shù)據(jù)
      default: () => ({ name: '匿名' }) // 默認值為對象時需用函數(shù)返回
    }
  }
}
</script>

2. 響應式處理(Vue2 關鍵注意點)

Vue2 中 provide 提供的數(shù)據(jù)默認是非響應式的。若需要響應式,需通過以下方式:

  • 傳遞組件的 datacomputed 中的響應式對象(因為 data 中的屬性本身是響應式的)。
  • 避免直接傳遞基本類型(如字符串、數(shù)字),建議包裹在對象中。

示例(響應式改造):

<!-- 父組件 -->
provide() {
  return {
    // 傳遞響應式對象(data 中的屬性)
    appState: this.appState
  }
},
data() {
  return {
    appState: {
      theme: 'dark', // 響應式
      user: { name: '張三' }
    }
  }
}
<!-- 子組件修改后,父組件會同步更新 -->
this.appState.theme = 'light' // 有效(響應式)

Vue3 中的用法

Vue3 中 provideinject 主要通過 Composition API 實現(xiàn)(在 setup 函數(shù)或 <script setup> 中使用),同時支持響應式傳遞。

1. 基本用法(<script setup>)

  • vue 導入 provideinject 函數(shù)。
  • provide(key, value):第一個參數(shù)為 key(字符串或 Symbol),第二個參數(shù)為要共享的值。
  • inject(key, defaultValue):第一個參數(shù)為 key,第二個參數(shù)為可選默認值。

示例:

<!-- 父組件(Grandparent.vue) -->
<template>
  <div>父組件</div>
  <Parent />
</template>
<script setup>
import { provide } from 'vue'
import Parent from './Parent.vue'
// 提供數(shù)據(jù)(可直接提供基本類型或對象)
provide('theme', 'dark')
// 提供響應式數(shù)據(jù)(ref/reactive)
const user = { name: '張三' }
provide('user', user)
</script>
<!-- 子組件(Child.vue) -->
<template>
  <div>
    主題:{{ theme }}
    用戶名:{{ user.name }}
  </div>
</template>
<script setup>
import { inject } from 'vue'
// 注入數(shù)據(jù)(指定 key)
const theme = inject('theme', 'light') // 第二個參數(shù)為默認值
const user = inject('user', () => ({ name: '匿名' })) // 默認值為對象時建議用函數(shù)
</script>

2. 響應式處理(Vue3 優(yōu)勢)

Vue3 中,若 provide 傳遞的是 響應式數(shù)據(jù)refreactive),則 inject 后的數(shù)據(jù)會保持響應式(修改時自動更新)。

示例(響應式傳遞):

<!-- 父組件 -->
<script setup>
import { provide, ref, reactive } from 'vue'
// ref 響應式(基本類型)
const theme = ref('dark')
provide('theme', theme)
// reactive 響應式(對象)
const user = reactive({ name: '張三' })
provide('user', user)
// 父組件修改,子組件會同步更新
setTimeout(() => {
  theme.value = 'light'
  user.name = '李四'
}, 2000)
</script>
<!-- 子組件 -->
<script setup>
import { inject } from 'vue'
const theme = inject('theme')
const user = inject('user')
// 子組件修改響應式數(shù)據(jù),父組件也會同步(若需禁止,可用 readonly)
// const user = inject('user') // 可修改
// const user = readonly(inject('user')) // 只讀,防止子組件修改
</script>

3. 類型提示(TypeScript)

Vue3 中可通過 InjectionKey 實現(xiàn)類型約束(避免 key 沖突和類型錯誤):

// keys.ts
import type { InjectionKey } from 'vue'
export const themeKey: InjectionKey<string> = Symbol('theme')
export const userKey: InjectionKey<{ name: string }> = Symbol('user')
// 父組件
import { provide } from 'vue'
import { themeKey, userKey } from './keys'
provide(themeKey, 'dark') // 類型約束:必須是 string
provide(userKey, { name: '張三' }) // 類型約束:必須符合 { name: string }
// 子組件
import { inject } from 'vue'
import { themeKey, userKey } from './keys'
const theme = inject(themeKey, 'light') // 類型:string
const user = inject(userKey) // 類型:{ name: string } | undefined

使用場景

  1. 多層級共享配置:如主題(深色/淺色)、語言切換、全局權限等(跨組件共享的靜態(tài)或低頻變化數(shù)據(jù))。
  2. 插件/庫內部通信:插件向子組件傳遞配置或方法(如 UI 組件庫中,父組件向深層級子組件傳遞尺寸、樣式等)。
  3. 避免 props 鉆取:當組件層級較深(如 5 層以上),用 provide/inject 替代 props 逐級傳遞,減少代碼冗余。

不適合的場景

  • 簡單父子組件通信(直接用 props/emits 更清晰)。
  • 高頻變化或需要嚴格狀態(tài)管理的數(shù)據(jù)(建議用 Pinia/Vuex,便于追蹤狀態(tài)變化)。

基本原理

provideinject 基于 Vue 的組件實例樹實現(xiàn),核心邏輯如下:

  1. 數(shù)據(jù)存儲:每個組件實例(vm)會維護一個 provides 對象,用于存儲當前組件通過 provide 提供的數(shù)據(jù)。
  2. 查找鏈構建:當組件初始化時,會繼承父組件的 provides(形成一個原型鏈/查找鏈)。即:子組件的 provides 以父組件的 provides 為原型,以此類推。
  3. 注入查找:當子組件通過 inject 查找數(shù)據(jù)時,會沿著組件實例的 provides 鏈向上遍歷,直到找到匹配的 key 或到達根組件。

響應式原理

  • 若提供的是響應式數(shù)據(jù)(Vue2 中 data 里的對象,Vue3 中 ref/reactive),則依賴該數(shù)據(jù)的組件會被納入響應式依賴追蹤。當數(shù)據(jù)變化時,所有依賴組件會重新渲染。

總結

特性Vue2(Options API)Vue3(Composition API)
用法組件選項 provide(對象/函數(shù))、inject(數(shù)組/對象)導入 provide/inject 函數(shù),在 setup 中調用
響應式需手動傳遞響應式對象(如 data 中的屬性)原生支持 ref/reactive 響應式傳遞
類型支持較弱(需手動注釋)可通過 InjectionKey 實現(xiàn)強類型約束
靈活性依賴組件選項,靈活性較低可在 setup 中動態(tài)提供/注入,靈活性更高

核心作用一致:跨層級通信,減少 props 傳遞成本,適用于共享低頻變化的全局配置或插件內部通信。

到此這篇關于Vue中的provide與inject的文章就介紹到這了,更多相關vue provide與inject內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue中el-table兩個表尾合計行聯(lián)動同步滾動條實例代碼

    vue中el-table兩個表尾合計行聯(lián)動同步滾動條實例代碼

    項目開發(fā)中遇到一個比較兩個form差異的需求,但當item過多就需要滾動條,下面這篇文章主要給大家介紹了關于vue中el-table兩個表尾合計行聯(lián)動同步滾動條的相關資料,需要的朋友可以參考下
    2022-05-05
  • Vue 使用超圖SuperMap的實踐

    Vue 使用超圖SuperMap的實踐

    作為一名剛入門計算機語言的人來說,要想快速完成測試開發(fā)地圖項目,肯定要接用到SuperMap,本文主要介紹了Vue 使用超圖SuperMap的實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Vue.js計算機屬性computed和methods方法詳解

    Vue.js計算機屬性computed和methods方法詳解

    這篇文章主要為大家詳細介紹了Vue.js計算機屬性computed和methods方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 使用Vue-axios進行數(shù)據(jù)交互的方法

    使用Vue-axios進行數(shù)據(jù)交互的方法

    這篇文章主要介紹了使用Vue-axios進行數(shù)據(jù)交互詳情,文章圍繞Vue-axios進行數(shù)據(jù)交互的相關資料展開詳細內容,需要的小伙伴可以參考一下,希望對你的學習或工作有所幫助
    2022-03-03
  • Vue?+?Element?實現(xiàn)按鈕指定間隔時間點擊思路詳解

    Vue?+?Element?實現(xiàn)按鈕指定間隔時間點擊思路詳解

    這篇文章主要介紹了Vue?+?Element?實現(xiàn)按鈕指定間隔時間點擊,實現(xiàn)思路大概是通過加一個本地緩存的時間戳,通過時間戳計算指定時間內不能點擊按鈕,具體實現(xiàn)代碼跟隨小編一起看看吧
    2023-12-12
  • 簡單的Vue異步組件實例Demo

    簡單的Vue異步組件實例Demo

    大家都知道當使用時才裝入需要的組件,可以有效的提高首次裝入頁面的速度。比如在路由切換時,下面這篇文章主要給大家介紹了關于如何實現(xiàn)一個簡單的Vue異步組件的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • Vue渲染函數(shù)詳解

    Vue渲染函數(shù)詳解

    下面小編就為大家?guī)硪黄猇ue渲染函數(shù)詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue響應式Object代理對象的修改和刪除屬性

    vue響應式Object代理對象的修改和刪除屬性

    這篇文章主要為大家介紹了vue響應式Object代理對象的修改和刪除屬性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Antd下拉選擇,自動匹配功能的實現(xiàn)

    Antd下拉選擇,自動匹配功能的實現(xiàn)

    這篇文章主要介紹了Antd下拉選擇,自動匹配功能的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue的過濾器你真了解嗎

    Vue的過濾器你真了解嗎

    這篇文章主要為大家詳細介紹了Vue的過濾器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論

屏山县| 安义县| 安龙县| 微博| 凤冈县| 云霄县| 湘潭市| 鹤峰县| 余干县| 虎林市| 台北市| 泸水县| 万源市| 灵璧县| 红桥区| 石渠县| 漳州市| 阿勒泰市| 法库县| 陆川县| 阿拉善右旗| 平远县| 乐平市| 堆龙德庆县| 阿拉善右旗| 巩义市| 海安县| 全州县| 楚雄市| 睢宁县| 安陆市| 大埔区| 临城县| 金山区| 仪陇县| 嘉义市| 鞍山市| 西乌珠穆沁旗| 新泰市| 泽普县| 兴宁市|