vue3 常用的幾種元件通訊方式,大致如下
- Props/Emit
- Pinia
- 事件匯流排(mitt)
- Provide/Inject
- 瀏覽器本地儲存
1. Props / Emit
註釋:prop屬性名稱 / 方法名稱的格式,採用 camelCase 與 kebab-case。
1.1 props
(1)上游元件設定 prop 值(透過 v-bind 或 冒號)
或者
(2)下游元件接收 prop 值 (透過 defineProps 方法)
import { defineProps } from 'vue'
更多詳見:https://cn.vuejs.org/guide/components/props.html
1.2 Emit
(1)上游元件:接收來自下游元件的方法觸發
(2)下游元件:主動觸發上游元件的方法
或者
import { defineEmits } from 'vue'
2. Pinia
詳見 vue3的 store (Pinia)
3. 事件匯流排(第三方庫mitt)
第一步:安裝 mitt npm install mitt -save
第二步:初始化 mitt,即 新建一個 mitt.js 檔案,然後寫入如下內容
const emitter = new mitt()
export default emitter
第三步:觸發 mitt
import emitter from '@/utils/mitt'
function handleClick() {
emitter.emit('on-button-click', true);
}
第四步:接收 mitt
import { onMounted, onUnmounted } from 'vue';
import emitter from '@/utils/mitt'
function onFoo(e) { console.log(' 觸發了!'); }
// 監聽
onMounted(() => {
emitter.on('on-button-click', onFoo);
});
// 移除
onUnmounted(() => {
emitter.off('on-button-click', onFoo);
});
4. Provide/Inject
跨元件通訊的情況中,有時不需要臨近元件的資料,而是想要直接獲取更遠的祖級或孫級元件的資料。
採用 props 的逐級資料傳遞顯然比較麻煩,還需要注意中間元件的傳遞問題,如下圖:
provide-inject 的依賴注入方式,(就是在希望儘量避免 props逐級傳遞 可能出現問題的情況下而產生的),它無論層級有多深,都可以注入由祖元件提供給整條鏈路的依賴。
以下是 provide-inject 的使用方式:
(1)提供資料 provide()
註釋:一個元件可以多次呼叫 provide(),
provide()
函式接收兩個引數。
-
-
- 第一個引數是注入名,可以是一個字串或是一個
Symbol
- 第二個引數是提供的值,值可以是任意型別,包括響應式的狀態
- 第一個引數是注入名,可以是一個字串或是一個
-
特殊情況下,還可以在整個應用層面提供依賴,如下
(2)注入資料 inject()
註釋:inject() 函式有三個引數
-
-
- 第一個引數是注入的 key,與provide()函式的第一個引數對應
- 第二個引數是可選的預設值,即在沒有匹配到 key 時使用的預設值
- 第三個引數是可選的 boolean 值,表示第二個引數是否被當作一個工廠函式,如果是,則第二個引數必須是工廠函式
-
5. 瀏覽器本地儲存
採用 localstorage/sessionstorage 等儲存在瀏覽器本地,然後透過 pinia 或 偵聽器 來進一步處理,實現實時更新