Vue元件之間四種通訊方式詳解
阿新 • • 發佈:2022-01-11
目錄
- 前言
- 父子元件通訊
- 父元件與子孫元件的通訊
- 父元件獲取子元件資料
- 無需考慮元件關係的通訊
前言
框架提供了前端開發元件的思想,可以通過元件來組合成一個完整的頁面,都是隨著元件數量原來越多,元件之間難免需要相互通訊,那麼如何實現元件之間的通訊呢?下面介紹 vue 元件通訊的幾種方法
父子元件通訊
父元件傳遞 props
給子元件(資料以及改變資料的方法),子元件通過 $emit
來更新父元件的狀態
父元件定義,宣告狀態 { name: 'baidu.com' }
以及可以改變狀態的方法update()
,通過 name 傳遞和 @update 把 name 屬性和 update 方法傳遞給子元件
<template> <div> <Child : @update="update" /> </div> </template> <script> import Child from "./components/Child"; export default { name: "App",components: { Child,},data() { return { name: "baidu.com",}; },methods: { update() { this.name = "www.baidu.com"; },}; </script>vue
子元件的定義,定義 props 接收 name 屬性,通過 $emit 傳遞 update 引數通知父元件更新狀態
<template> <div> {{ name }} <button @click="$emit('update')">通知父元件資料</button> </div> </template> <script> export default { name: "Child",props: { name: String,}; </script>
父元件與子孫元件的通訊
父元件通過 provide 建立物件,子元件通過 inject 來使用父元件的資料,不受元件層級的限制
父元件通過 provide 定義需要傳遞是資料
<template> <div> <Child /> </div> </template> <script> import Child from "./components/Child"; export default { name: "App",provide: { name: "www.baidu.com",}; </script>
子元件通過 inject 屬性控制哪些屬性需要訪問
<template> <div>{{ name }}</div> </template> <script> export default { namewww.cppcns.com: "Child",inject: ["name"],}; </script>
父元件獲取子元件資料
通過ref
來獲取子元件的例項,可以獲取子元件的狀態或者呼叫子元件的方法,例如下面
<template> <div> <Child rDNQIZtWEef="child" /> </div> </template> <script> import Child from "./components/Child"; export default { name: "App",mounted() { consowww.cppcns.comle.log(this.$refs.child.title); },}; </script>
可以通過 this.$refs.child 獲取到 Child 元件的例項,訪問 Child 元件的 data
無需考慮元件關係的通訊
通過 vue 提供的釋出訂閱模式,也叫做 EventBus(事件匯流排)
定義一個 eventBus 例項
import Vue from "vue"; export default new Vue();
父元件在 mounted 生命週期裡面通過 $on 監聽 update 事件
<template> <div> <Child : /> </div> </template> <script> import Child from "./components/Child"; import eBus from "../eventBus"; export default { name: "App",mounted() { eBus.$on("update",(val) => { this.name = val; }); },}; </script>
子元件通過 vue 例項的 $emit 觸發 update 事件
<template>
<div>
{{ name }}
<button @click="clickHandle">通知父元件更新</button>
</div>
</template>
<script>
import eBus from "../../eventBus";
export default {
name: "Child",props: {
name: Strwww.cppcns.coming,data() {
return {
title: "child component",methods: {
clickHandle() {
eBus.$emit("update","Hello World");
},};
</script>
使用全域性狀態管理庫 vuex
具體就不在這裡展開講,有興趣的可以查閱 vue 官方文件
到此這篇關於Vue元件之間四種通訊方式詳解的文章就介紹到這了,更多相關Vue元件通訊內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!