Vue組件之間四種通信方式詳解
前言
vue 框架提供瞭前端開發組件的思想,可以通過組件來組合成一個完整的頁面,都是隨著組件數量原來越多,組件之間難免需要相互通信,那麼如何實現組件之間的通信呢?下面介紹 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", components: { Child, }, provide: { name: "www.baidu.com", }, }; </script>
子組件通過 inject 屬性控制哪些屬性需要訪問
<template> <div>{{ name }}</div> </template> <script> export default { name: "Child", inject: ["name"], }; </script>
父組件獲取子組件數據
通過ref
來獲取子組件的實例,可以獲取子組件的狀態或者調用子組件的方法,例如下面
<template> <div> <Child ref="child" /> </div> </template> <script> import Child from "./components/Child"; export default { name: "App", components: { Child, }, mounted() { console.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", data() { return { name: "baidu.com", }; }, components: { Child, }, 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: String, }, data() { return { title: "child component", }; }, methods: { clickHandle() { eBus.$emit("update", "Hello World"); }, }, }; </script>
使用全局狀態管理庫 vuex
具體就不在這裡展開講,有興趣的可以查閱 vue 官方文檔
到此這篇關於Vue組件之間四種通信方式詳解的文章就介紹到這瞭,更多相關Vue組件通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!