Vue3 中的 provide 和 inject 詳解:實現跨組件通信

一、provide 和 inject 概述

在 Vue3 中,provide?和?inject?是一對用于實現跨層級組件通信的 API,它們解決了 props 需要逐層傳遞的繁瑣問題。

1.1 基本概念

  • provide (提供):在祖先組件中提供數據

  • inject (注入):在任意后代組件中注入這些數據

1.2 與 props 的對比

特性propsprovide/inject
傳遞方向父 → 子祖先 → 任意后代
層級限制必須逐層傳遞可跨任意層級
適用場景直接父子組件通信主題/配置/全局數據
響應性默認支持需要額外處理

二、基本使用方法

2.1 選項式 API 寫法

javascript

// 祖先組件
export default {provide: {theme: 'dark'}
}// 后代組件
export default {inject: ['theme'],created() {console.log(this.theme) // 輸出 'dark'}
}

2.2 組合式 API 寫法(推薦)

html

<!-- 祖先組件 -->
<script setup>
import { provide } from 'vue'// 提供靜態數據
provide('theme', 'dark')// 提供響應式數據
const count = ref(0)
provide('count', count)
</script><!-- 后代組件 -->
<script setup>
import { inject } from 'vue'// 注入數據
const theme = inject('theme')
const count = inject('count')// 設置默認值
const size = inject('size', 'default') // 如果沒有提供 size,則使用 'default'
</script>

三、響應式處理

3.1 保持響應性

html

<script setup>
import { provide, ref } from 'vue'const count = ref(0)
provide('count', count)// 在提供者中修改
function increment() {count.value++
}
</script><!-- 后代組件 -->
<script setup>
import { inject } from 'vue'const count = inject('count')// 注入的值會自動保持響應性
watch(count, (newVal) => {console.log('count changed:', newVal)
})
</script>

3.2 提供修改方法(推薦模式)

html

<script setup>
import { provide, ref } from 'vue'const count = ref(0)// 同時提供值和修改方法
provide('count', {count,increment: () => count.value++
})
</script><!-- 后代組件 -->
<script setup>
const { count, increment } = inject('count')
</script>

四、高級用法

4.1 使用 Symbol 作為 key

避免命名沖突:

javascript

// keys.js
export const THEME_KEY = Symbol('theme')// 提供者
import { THEME_KEY } from './keys'
provide(THEME_KEY, 'dark')// 注入者
const theme = inject(THEME_KEY)

4.2 應用層 provide

在應用級別提供全局數據:

javascript

// main.js
import { createApp } from 'vue'
import App from './App.vue'const app = createApp(App)
app.provide('appVersion', '1.0.0')
app.mount('#app')

4.3 結合 TypeScript 使用

typescript

interface User {id: numbername: string
}// 提供者
const user = ref<User>({ id: 1, name: 'John' })
provide<User>('user', user)// 注入者
const user = inject<User>('user')

五、最佳實踐

  1. 避免濫用:只在確實需要跨多層組件通信時使用

  2. 命名規范:使用有意義的鍵名或 Symbol

  3. 文檔說明:為提供的屬性添加注釋說明

  4. 響應式處理:確保正確處理響應式數據

  5. 類型安全:在 TypeScript 項目中定義清晰接口

六、典型應用場景

  1. 主題切換功能

  2. 國際化實現

  3. 用戶身份信息共享

  4. 全局配置參數

  5. 復雜表單中的狀態共享

七、完整示例

7.1 主題切換實現

html

<!-- ThemeProvider.vue -->
<script setup>
import { provide, ref } from 'vue'const theme = ref('light')
const toggleTheme = () => {theme.value = theme.value === 'light' ? 'dark' : 'light'
}provide('theme', {theme,toggleTheme
})
</script><template><slot />
</template><!-- App.vue -->
<template><ThemeProvider><NavBar /><Content /></ThemeProvider>
</template><!-- NavBar.vue -->
<script setup>
const { theme, toggleTheme } = inject('theme')
</script><template><button @click="toggleTheme">當前主題: {{ theme }}</button>
</template>

八、注意事項

  1. 不是響應式的:如果直接提供基本類型值,注入的值不會是響應式的

  2. 避免直接修改:除非明確設計如此,否則避免在注入組件中直接修改注入的值

  3. 組件封裝性:過度使用會破壞組件獨立性,使組件更難復用

九、總結

provide?和?inject?是 Vue3 中強大的跨組件通信工具,特別適合解決"prop 逐級透傳"問題。正確使用它們可以:

  • 簡化深層嵌套組件間的通信

  • 實現全局狀態管理(輕量級替代 Vuex/Pinia)

  • 創建可復用的上下文組件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93581.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka 零拷貝(Zero-Copy)技術詳解

文章目錄1. 什么是零拷貝2. Kafka 如何實現零拷貝2.1 sendfile 系統調用2.2 mmap 內存映射3. 傳統拷貝 vs 零拷貝3.1 傳統文件傳輸流程3.2 零拷貝文件傳輸流程4. Kafka 零拷貝的具體實現4.1 消息消費時的零拷貝4.2 日志段文件的零拷貝5. 零拷貝帶來的性能優勢6. 零拷貝的適用場…

Vue 中 v-for 的使用及 Vue2 與 Vue3 的區別

v-for 基本用法v-for 是 Vue 中用于循環渲染列表的指令&#xff0c;基本語法如下&#xff1a;運行<!-- Vue2 和 Vue3 通用基本語法 --> <div v-for"(item, index) in items" :key"item.id">{{ index }} - {{ item.name }} </div>Vue2 和…

本地搭建dify+deepseek智能體

今天開始搭建智能體&#xff0c;學習一下&#xff0c;也是公司轉型所需。(Windows下的docker安裝給我差點干破防了&#xff0c;安裝了一周docker才成功。我真就要放棄的時候&#xff0c;又意外成功了/(ㄒoㄒ)/~~)0、準備階段 配置Windows10的基本配置。 按下鍵盤Windows鍵&…

網絡常識-SSE對比Websocket

SSE&#xff08;Server-Sent Events&#xff09;和Websocket都是用于實現服務器與客戶端實時通信的技術&#xff0c;但它們的設計理念、通信模式和適用場景有顯著區別。以下從核心差異和適用場景兩方面具體說明&#xff1a; 一、核心區別維度SSE&#xff08;Server-Sent Events…

lamp架構部署wordpress

CentOS 7主機&#xff1a;lamp.example.comIP&#xff1a;192.168.100.101、關閉防火墻與selinux# 關閉防火墻systemctl stop firewalldsystemctl disable firewalld# 關閉selinuxvim /etc/selinux/config # 或vim /etc/sysconfig/selinuxSELINUXdisabled:wq# 重啟reboot 2、開…

DC6v-36V轉3.2V1A恒流驅動芯片WT7017

DC6v-36V轉3.2V1A恒流驅動芯片WT7017WT7017是一款于連續工作模式下的降壓LED恒流轉換器&#xff0c;可驅動單只或多只LED,內置高精度電流檢測器&#xff0c;能通過外置電阻設定輸出電流,開關式1A恒流芯片。軟啟動、高達1MHZ開關頻率,開路保護,輸入范圍在6V-40VDC內都能穩定可靠…

js如何循環HTMLCollection

場景 當使用document.getElementsByClassName方法獲取一個包含DOM節點的集合arr時&#xff0c;正常的forEach和map操作都會報一個arr.map is not a function的錯誤因為這里的arr并不是標準的 數組 (Array)&#xff0c;而是一個 HTMLCollection 解決 使用document.querySelector…

Dart 逆襲之路:Flutter 4.0 如何推動移動端開發變革?

本文深入探討 Dart 語言在 Flutter 4.0 框架下如何推動移動端開發變革。開篇回顧 Dart 誕生背景與初期困境&#xff0c;闡述其在與 Flutter 結合后嶄露頭角。進而詳細剖析 Flutter 4.0&#xff0c;從全新渲染引擎帶來的性能飛躍、豐富實用新組件簡化開發&#xff0c;到手勢系統…

基于MATLAB的卷積神經網絡手寫數字識別

一、系統架構設計 #mermaid-svg-QQU8judlmQgHc2Lh {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QQU8judlmQgHc2Lh .error-icon{fill:#552222;}#mermaid-svg-QQU8judlmQgHc2Lh .error-text{fill:#552222;stroke:#5…

從廢棄到珍寶——舊物二手回收小程序系統的價值發現之旅

在我們的生活中&#xff0c;總有一些舊物因為各種原因而被遺棄在角落&#xff0c;它們或許不再新潮&#xff0c;或許不再實用&#xff0c;但它們卻承載著我們的記憶和情感。舊物二手回收小程序系統的出現&#xff0c;讓這些被遺忘的舊物重新煥發了生機&#xff0c;開啟了一段從…

從0開始學習Java+AI知識點總結-16.web基礎知識

一、SpringBoot Web 入門開發SpringBoot 簡化了傳統 Spring 應用的配置流程&#xff0c;通過 "約定大于配置" 的理念實現快速開發。以下是入門核心要點&#xff1a;1. 工程創建與依賴配置工程初始化&#xff1a;通過 Spring Initializr 創建工程&#xff0c;選擇Spri…

代碼隨想錄Day51:圖論(島嶼數量 深搜廣搜、島嶼的最大面積)

一、實戰 99島嶼數量 深搜 99. 島嶼數量 本題中每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成&#xff0c;也就是說斜角度鏈接是不算的。思路是用遇到一個沒有遍歷過的節點陸地&#xff0c;計數器就加一&#xff0c;然后把該節點陸地所能遍歷到的陸地都標記上。在…

讀取數據excel

import pandas as pd from datetime import datetimedef generate_questions():excel_path df pd.read_excel(excel_path)theme []time_list []tag1 []tag2 []tag3 []word_count 800questions []for index, row in df.iterrows():if isinstance(row[時間], datetime):…

前端環境安裝

1.vsCode 下載鏈接&#xff1a;Visual Studio Code - Code Editing. Redefined 添加一個wiz code擴展&#xff08;提示你需要升級的依賴&#xff09; wiz code 使用方法 效果 2.git 下載鏈接&#xff1a;Git - Downloads 先下載 Homebrew&#xff08;https://brew.sh/ &a…

零基礎學Java第十八講---抽象類和接口(3)

續接上一講 目錄 一、內部類 1、內部類的分類 2、靜態內部類 3、實例內部類---未被static修飾的成員內部類 4、局部內部類 5、匿名內部類 二、Object類 1、獲取對象信息 2、equals方法 3、hashcode方法 一、內部類 當?個事物的內部&#xff0c;還有?個部分需要?個…

字節數據流

記錄 干貨&#xff5c;8000字長文&#xff0c;深度介紹Flink在字節跳動數據流的實踐 字節跳動基于Flink的MQ-Hive實時數據集成

Vision Master的C#腳本與opencv聯合編程

需要在VM的C#腳本設置string類型Out變量和float類型OutF變量&#xff0c;python的輸出信息會在Out變量顯示 using System; using System.IO; using Script.Methods; using System.Diagnostics; using System.Net.Sockets; using System.Text; using System.Threading;public pa…

運維工作架構流程搭建

前言 在解決了運維是干什么的&#xff0c;運維的工作的意義后&#xff0c;這一章我們系統性的講講運維工作流程搭建&#xff0c;希望大家能通過我的分享有所收獲&#xff0c;這一章干貨滿滿。 一、網絡服務器架構 按照一般的訪問方式&#xff0c;按照我自己的理解畫了一個網絡服…

安全存儲之 SAES+HUK 使用技巧和常見問題 LAT1543

關鍵字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存儲 引言 近年來&#xff0c;嵌入式設備信息安全被越來越多地提及&#xff0c;從智能穿戴產品、智能工業設備到物聯網產品都對設備信息安全提出了要求&#xff0c;比如基礎的安全啟動&#xff0c;安全升級&#xff0…

ubuntu 20.04 搭建多用戶遠程桌面共享及同時在線使用

使用效果: 物理機: 遠程桌面用戶: 實現過程: 1.使用腳本安裝xrdp并修改配置及啟動服務 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…