前端基礎之《Vue(14)—組件通信(1)》

一、什么是組件通信

1、通信是組件或模塊之間的數據交互。

2、組件多重通信就形成了數據流,數據流管理的優劣決定了產品能否上線,返工是否頻繁的問題。

3、Vue中有哪些常見的通信方案?

組件樹的概念:
在Vue中,組件樹(Component Tree)指的是一個由多個嵌套的Vue組件組成的層級結構。每個組件可以是另一個組件的子組件,這樣層層嵌套形成一棵樹。這種結構允許開發者構建復雜和可重用的用戶界面。

(1)父子組件通信
父傳子使用自定義屬性(使用props接收),子傳父使用自定義事件(使用$emit)。

(2)狀態提升
狀態就是數據的意思。
當兄弟組件之間需要共享數據時,我們通常的做法是把這個數據定義在它們的共同的父組件中,再通過自定義屬性實現數據共享。

(3)provide/inject通信
這是一種在組件樹間自上而下的一種數據通信方案。
也就是說,只能從父級組件中向后代組件傳遞。
是Vue提供的兩個內置選項,可以對象寫法,也可以function寫法。

需要注意的是,當provide提供動態數據(聲明式變量)時,動態數據發生變化,后代組件們不會自動更新,這是為什么呢?
因為生命周期流程中,是在beforeCreate()和created()之間,inject注入provide數據。
所以下面在例子代碼里,更新父組件中的provide數據,子組件不會更新!!!

(4)ref通信
ref是Vue內置的一個屬性,就像id、class一樣,每一個HTML元素或組件都有這個屬性。
ref作用在HTML元素上,得到DOM實例,ref作用在組件上得到組件實例。
使用ref訪問組件實例,可以進一步訪問組件中的數據和方法。

ref是一種快捷的DOM訪問方式,當然ref也可以作用在組件上得到組件實例對象。這些ref得到的DOM實例或組件實例,使用this.$refs來訪問它們。
ref盡量少用,除非某些難搞的需求。

(5)slot插槽通信
從子組件向父組件傳遞數據,在父組件的插槽中,使用#default='scoped'訪問子組件<slot>回傳的數據。
子組件訪問插槽,借助this.$slots訪問父組件中的插槽實例。
這種通信在組件庫中、工作中,非常常見。

注意:在自定義插槽<comp-child-e>包起來的內容是父組件的。

(6)$parent/$children通信
借助$parent/$children這兩個API,可以實現在任一組件中訪問組件樹中的其它任意組件實例。可以做到在組件中隨意穿梭。

$parent表示的是當前組件的父組件實例對象。
$children表示的是當前組件的子組件們。

(7)$attrs/$listeners通信
借助$attrs可以訪問父組件傳遞過來的自定義屬性(除了class和style外)。
借助$listeners可以訪問父組件給的自定義事件。
在某些場景下,$attrs/$listeners可以替代props/$emit()這種通用的通信方式。

(8)事件總線
借助Vue內置的事件系統。($on/$emit/$off/$once)實現“訂閱-發布”模式的通信。這種通信方式是一對多的,且與組件的層級無關。

(9)Vuex通信
這是Vue架構中終極的通信方案,也是Vue架構中用的最多的一種通信方式。

二、狀態提升例子

有一個變量大哥點了加1,二哥點了減1。

<html>
<head><title>組件通信-狀態提升</title><style></style>
</head>
<body><div id="app"><comp-child-a :numa="num" @add="num+=$event"></comp-child-a><hr><comp-child-b :numb="num" @sub="num-=$event"></comp-child-b><hr></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-a', {template: `<div><div>大哥  {{numa}}</div><button @click='$emit("add", 1)'>加1</button></div>`,props: {numa: {type: Number, default: 0}}})Vue.component('comp-child-b', {template: `<div><div>二哥  {{numb}}</div><button @click='$emit("sub", 1)'>減1</button></div>`,props: {numb: {type: Number, default: 0}}})const app = new Vue({// 變量定義在父組件中data() {return {num: 1}}})app.$mount('#app')</script></body>
</html>

三、provide/inject例子

注意:provide提供聲明式變量numf,如果在父組件中修改了app.num的值,子組件中不會改變!!!

<html>
<head><title>組件通信-provide/inject</title><style></style>
</head>
<body><div id="app"><comp-child-c></comp-child-c></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-c', {template: `<div><div>三哥 {{msg}} - {{numf}}</div><span v-for='i in list' v-text='i'></span></div>`,// 從組件樹的上下文中注入provide的數據inject: ['msg','list','numf']})const app = new Vue({// 變量定義在父組件中data() {return {num: 1}},// 從當前組件節點開始,向后代組件們傳遞數據// 工作中更推薦function寫法,因為可以用this// provide: {//     msg: "你好",//     list: [1,2,3,4]// }provide() {return {msg: '你好',list: [1,2,3,4],numf: this.num // 動態數據}}})app.$mount('#app')</script></body>
</html>

四、ref例子

<html>
<head><title>組件通信-ref</title><style></style>
</head>
<body><div id="app"><div ref='box'>普通HTML標簽</div><comp-child-d ref='dd'></comp-child-d><button @click='handle'>測試ref操作</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-d', {template: `<div><div>四哥  {{age}}</div></div>`,data() {return {age: 10}},methods: {changeAge(arg) {this.age = arg || 10}}})const app = new Vue({// 變量定義在父組件中data() {return {num: 1}},methods: {handle() {console.log('---refs', this.$refs)this.$refs.box.style.color = 'red'this.$refs.dd.changeAge(20)}}})app.$mount('#app')</script></body>
</html>

點擊按鈕:

獲取到DOM實例和組件實例:

五、插槽例子

在Vue中,凡是被包裹在自定義組件內部的東西,都是插槽內容。

問題:插槽加上作用域后,子組件內插槽內的this.$slots拿不到父組件內的插槽內容?
解答:加了作用域后,要取$scopedSlots屬性。

<html>
<head><title>組件通信-插槽</title><style></style>
</head>
<body><div id="app"><comp-child-e><template #default='scoped'><div>別墅一棟  {{scoped.foo}}  {{scoped.bar}}</div></template><template #car='scoped'><div>{{scoped.car2}}專用車位</div></template></comp-child-e></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-e', {template: `<div><div>五哥</div><slot name='default' foo='你好' bar='世界'><div>我的房子</div>    </slot><slot name='car' :car2='car1'><div>我的車位</div></slot></div>`,data() {const cars = ['寶馬','奔馳']const val = cars[Math.floor(Math.random()*2)]return {car1: val}},mounted() {// 在子組件中使用this.$slots來訪問父組件給的插槽內容//console.log('---this', this)console.log('---slot', this.$slots)console.log('---scoped slot', this.$scopedSlots)}})const app = new Vue({})app.$mount('#app')</script></body>
</html>

頁面顯示:

控制臺:

六、$parent/$children例子

<html>
<head><title>組件通信-$parent/$children</title><style></style>
</head>
<body><div id="app"><comp-child-f></comp-child-f></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-f', {template: `<div><div>六哥  {{num}}</div></div>`,data() {return {num: 1}},methods: {add() {this.num++}}})const app = new Vue({mounted() {console.log('app---$parent', this.$parent)console.log('app---$children', this.$children)}})app.$mount('#app')</script></body>
</html>

頁面顯示:

控制臺修改num:

頁面變化:

七、$attrs/$listeners例子

<html>
<head><title>組件通信-$attrs/$listeners</title><style>.page span {display: inline-block;padding: 0 10px;cursor: pointer;}.page span.on {color: red;}</style>
</head>
<body><div id="app"><comp-child-g :page='page' @change='changePage'></comp-child-g></div><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>Vue.component('comp-child-g', {template: `<div class="page"><div>七哥</div><span v-for='i in pageArr' v-text='i' :class='{on:$attrs.page===i}' @click='$listeners.change(i)'></span></div>`,// 這里不用props接收,用attrsmounted() {console.log('g---attrs', this.$attrs)console.log('g---listeners', this.$listeners)},computed: {pageArr() {const p = this.$attrs.pageif (p<=3) return [1,2,3,4,5]else return [p-2,p-1,p,p+1,p+2]}}})const app = new Vue({data() {return {page: 1}},methods: {changePage(reg) {this.page = reg || 1}}})app.$mount('#app')</script></body>
</html>

頁面顯示:

控制臺修改page:

頁面變化:

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

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

相關文章

el-row el-col

參考layout布局 Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫https://element.eleme.cn/#/zh-CN/component/layout#row-attributes 一行可以看做24個 Element UI 中的 el-row 是…

Socket-TCP

在TCP/ip協議中&#xff0c;用源IP、源端口號、目的IP、目的端口號、協議號這樣一個五元組來標識一個通信&#xff01; 端口號范圍劃分 0 - 1023: 知名端口號&#xff0c;HTTP&#xff0c;FTP&#xff0c;SSH 等這些廣為使用的應用層協議&#xff0c;他們的端口號都是固定的。…

大數據Spark(五十八):Spark Pi介紹

文章目錄 Spark Pi介紹 Spark Pi介紹 Spark Pi是Apache Spark官方提供的一個示例程序&#xff0c;該案例使用 Spark 進行分布式計算&#xff0c;通過蒙特卡羅方法估算圓周率&#xff08;π&#xff09;的值&#xff0c;其估算π原理如下&#xff1a; 上圖中&#xff0c;正方形…

Doris索引機制全解析,如何用高效索引加速數據分析

在當今大數據時代&#xff0c;企業對于實時數據分析的需求呈現爆發式增長。面對動輒PB級的數據量和秒級響應的業務訴求&#xff0c;傳統數據庫系統往往力不從心。Apache Doris作為新一代MPP分析型數據庫&#xff0c;憑借其獨特的索引機制&#xff0c;在京東、美團等企業的實時數…

基于SpringBoot + Vue 的作業管理系統

產品包含&#xff1a; 項目源碼數據庫文件論文ppt 技術棧 架構: B/S、MVC 系統環境&#xff1a;Windows/Mac 開發環境&#xff1a;IDEA、JDK1.8、Maven、Mysql 技術棧&#xff1a;Java、Mysql、SpringBoot、Mybatis、Vue 功能模塊 用戶模塊&#xff1a;學生用戶、管理員、…

HCL(HashiCorp Configuration Language)是一種結構化配置語言

HCL&#xff08;HashiCorp Configuration Language&#xff09;是一種結構化配置語言&#xff0c;語法簡潔且可讀性強&#xff0c;廣泛用于 Docker Buildx Bake、Terraform、Nomad 等工具的配置。以下是其核心語法規則和示例&#xff1a; 1. 基礎結構 HCL 使用 塊&#xff08;…

《AI大模型應知應會100篇》第50篇:大模型應用的持續集成與部署(CI/CD)實踐

第50篇&#xff1a;大模型應用的持續集成與部署&#xff08;CI/CD&#xff09;實踐 &#x1f9fe; 摘要 在AI大模型開發中&#xff0c;隨著模型版本迭代頻繁、依賴復雜、部署環境多樣&#xff0c;構建一套高效可靠的持續集成與持續交付&#xff08;CI/CD&#xff09;流程顯得尤…

【Linux深入淺出】之全連接隊列及抓包介紹

【Linux深入淺出】之全連接隊列及抓包介紹 理解listen系統調用函數的第二個參數簡單實驗實驗目的實驗設備實驗代碼實驗現象 全連接隊列簡單理解什么是全連接隊列全連接隊列的大小 從Linux內核的角度理解虛擬文件、sock、網絡三方的關系回顧虛擬文件部分的知識struct socket結構…

DB-GPT V0.7.1 版本更新:支持多模態模型、支持 Qwen3 系列,GLM4 系列模型 、支持Oracle數據庫等

V0.7.1版本主要新增、增強了以下核心特性 &#x1f340;DB-GPT支持多模態模型。 &#x1f340;DB-GPT支持 Qwen3 系列&#xff0c;GLM4 系列模型。 &#x1f340; MCP支持 SSE 權限認證和 SSL/TLS 安全通信。 &#x1f340; 支持Oracle數據庫。 &#x1f340; 支持 Infini…

2025五一數學建模競賽A題完整分析論文(共45頁)(含模型、可運行代碼、數據)

2025年五一數學建模競賽A題完整分析論文 摘 要 一、問題分析 二、問題重述 三、模型假設 四、符號定義 五、 模型建立與求解 5.1問題1 5.1.1問題1思路分析 5.1.2問題1模型建立 5.1.3問題1參考代碼 5.1.4問題1求解結果 5.2問題2 5.2.1問題2思路分析 …

[學習]RTKLib詳解:pntpos.c與postpos.c

文章目錄 RTKLib詳解&#xff1a;pntpos.c與postpos.cPart A: pntpos.c一、概述二、整體工作流程三、主要函數說明1. pntpos()2. satposs()3. estpos()4. rescode()5. prange()6. ionocorr()7. tropcorr()8. valsol()9. raim_fde()10. estvel() 四、函數調用關系圖&#xff08;…

【科研繪圖系列】R語言繪制世界地圖(map plot)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖輸出圖片系統信息介紹 【科研繪圖系列】R語言繪制世界地圖(map plot) 加載R包 library(ggmap) library(RColorBrewer) library(pals) …

在pycharm profession 2020.3上安裝使用xlwings

之前寫了一篇文章在win7和python3.8上安裝xlwings-CSDN博客 今天安裝了pycharm profession 2020.3&#xff0c;自帶Terminal&#xff0c;所以試一下安裝xlwings。 一、新建一個python項目 二、安裝xlwings 三、輸入安裝命令 pip3.exe install -i https://pypi.tuna.tsinghu…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】4.3 數據脫敏與安全(模糊處理/掩碼技術)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL數據脫敏實戰&#xff1a;從模糊處理到動態掩碼的全流程解析4.3 數據脫敏與安全&#xff1a;模糊處理與掩碼技術深度實踐4.3.1 數據脫敏的核心技術體系4.3.1.1 技…

堅鵬:平安保險集團《保險行業發展趨勢與AI應用方法及案例》培訓

堅鵬&#xff1a;平安保險集團《保險行業發展趨勢與AI應用方法及案例》培訓圓滿成功 中國平安保險&#xff08;集團&#xff09;股份有限公司是全球領先的綜合金融生活服務集團&#xff0c;2024年位列《財富》世界500強第16位&#xff0c;連續多年蟬聯全球保險品牌價值榜首。截…

NetSuite 2025.1 學習筆記

目錄 領域、新功能統計表 值得注意功能摘要 最有價值功能詳解 1. 領域、新功能統計表 2. 值得注意功能 3. 最有價值功能 3.1 Customer 360 目前的Customer 360在加入了幾個新的控件后&#xff0c;變得完整了&#xff0c;相比較過去&#xff0c;真正有了實用感。 3.2 CSV Im…

Messenger.Default.Send 所有重載參數說明

Messenger.Default.Send 是 MVVM 框架中實現消息傳遞的核心方法,其重載參數主要用于控制消息的發送范圍和接收條件。以下是其所有重載形式及參數說明: ?1. 基本消息發送? Send<TMessage>(TMessage message) ?參數說明?: TMessage:消息類型(泛型參數),可以是任…

代碼異味(Code Smell)識別與重構指南

1、引言:什么是“代碼異味”? 在軟件開發中,“代碼異味(Code Smell)”是指那些雖然不會導致程序編譯失敗或運行錯誤,但暗示著潛在設計缺陷或可維護性問題的代碼結構。它們是代碼演進過程中的“信號燈”,提示我們某段代碼可能需要優化。 1.1 ? 為什么關注代碼異味? 預…

K8S有狀態服務部署(MySQL、Redis、ES、RabbitMQ、Nacos、ZipKin、Sentinel)

K8S部署MySQL ①、創建配置 ②、創建存儲卷 ③、創建服務 指定配置文件 指定存儲卷 ④、同樣的方式創建mysql-slaver服務&#xff08;配置文件和mysql-master不同&#xff09; ⑤、進行主從同步關聯 進入master服務中 進入從庫的終端 K8S部署Redis…

正則表達式與文本三劍客grep、sed、awk

目錄 一、正則表達式 1.1、字符匹配 1.2、次數匹配 1.3、位置錨定 1.4、分組或其他 二、擴展正則表達式 三、grep 四、awk 4.1、常用命令選項 4.2、工作原理 4.3、基礎用法 4.4、內置變量 4.5、模式 4.6、條件判斷 4.7、awk中的循環語句 4.8、數組 4.9、腳本 …