Vue2組件傳值(通信)的方式

1.父傳后代 ( 后代拿到了父的數據 )

1. 父組件引入子組件,綁定數據

<List :str1=‘str1’></List>

子組件通過props來接收
props:{str1:{type:String,default:''}}
***這種方式父傳子很方便,但是父傳給孫子輩分的組件就很麻煩(父=》子=》孫)
這種方式:子不能直接修改父組件的數據

2. 子組件直接使用父組件的數據

子組件通過:this.$parent.xxx使用父組件的數據
這種方式:子可以直接修改父組件的數據

3. 依賴注入(使用 provide/inject API)

優勢:父組件可以直接向某個后代組件傳值(不讓一級一級的傳遞)

在這里插入圖片描述

1.在祖先組件中使用 provide

在祖先組件中,你可以使用 provide 選項來提供數據或方法。這些數據或方法可以被任何后代組件通過 inject 選項來接收。

<!-- AncestorComponent.vue -->  
<template>  <div>  <DescendantComponent />  </div>  
</template>  <script>  
import DescendantComponent from './DescendantComponent.vue';  export default {  components: {  DescendantComponent  },  provide() {  return {  foo: 'foo',  myMethod: this.myMethod  };  },  methods: {  myMethod() {  console.log('This is a method from AncestorComponent.');  }  }  
};  
</script>

2.在后代組件中使用 inject

在后代組件中,你可以使用 inject 選項來接收在祖先組件中 provide 的數據或方法。

<!-- DescendantComponent.vue -->  
<template>  <div>  <p>{{ foo }}</p>  <button @click="callAncestorMethod">Call Ancestor Method</button>  </div>  
</template>  <script>  
export default {  inject: ['foo', 'myMethod'],  methods: {  callAncestorMethod() {  this.myMethod();  }  }  
};  
</script>

在這個例子中,DescendantComponent 接收了 foo 字符串和 myMethod 方法,它們都是在 AncestorComponent 中通過 provide 提供的。

2.后代傳父 (父拿到了后代的數據)

1. 子組件傳值給父組件

子組件定義自定義事件 this.$emit

子組件中:

// ChildComponent.vue  
export default {  methods: {  sendToParent() {  this.$emit('child-event', 'Data from child');  }  }  
};

父組件中:

<!-- ParentComponent.vue -->  
<template>  <div>  <ChildComponent @child-event="handleChildEvent" />  </div>  
</template>  <script>  
// ...  
export default {  // ...  methods: {  handleChildEvent(data) {  console.log('Received data from child:', data);  }  }  
};  
</script>

2. 父組件直接拿到子組件的數據

<List ref=‘child’></List>
this.$refs.child

下面是一個簡單的例子,展示了如何在父組件中通過 $refs 訪問子組件的方法:

<!-- ChildComponent.vue -->  
<template>  <div>  <button @click="sayHello">Say Hello</button>  </div>  
</template>  <script>  
export default {  methods: {  sayHello() {  console.log('Hello from ChildComponent!');  }  }  
};  
</script>  <!-- ParentComponent.vue -->  
<template>  <div>  <ChildComponent ref="child" />  <button @click="callChildMethod">Call Child's Method</button>  </div>  
</template>  <script>  
import ChildComponent from './ChildComponent.vue';  export default {  components: {  ChildComponent  },  methods: {  callChildMethod() {  this.$refs.child.sayHello(); // 調用子組件的 sayHello 方法  }  }  
};  
</script>

在這個例子中,點擊父組件的按鈕會觸發 callChildMethod 方法,該方法通過 this.$refs.child.sayHello() 調用了子組件的 sayHello 方法。

3.平輩之間的傳值 ( 兄弟可以拿到數據 )

通過新建bus.js文件來做

在 Vue.js 中,如果你想要在不直接依賴父子組件關系的情況下進行組件間的通信,一個常見的方法是創建一個全局的事件總線(Event Bus)。你可以通過創建一個新的 Vue 實例來作為這個事件總線,并在你的組件中通過它來進行事件的觸發($emit)和監聽($on)

以下是如何通過新建一個 bus.js 文件來創建全局事件總線的步驟:

創建 bus.js 文件

在你的項目根目錄或合適的地方,創建一個 bus.js 文件,并導出一個新的 Vue 實例:

// bus.js  
import Vue from 'vue';  export const EventBus = new Vue();

在組件中觸發事件 ,在你的組件中,你可以導入 EventBus 并使用 $emit 方法來觸發事件:

// ChildComponent.vue  
<template>  <button @click="notify">Notify Parent</button>  
</template>  <script>  
import { EventBus } from './bus.js'; // 假設 bus.js 和當前文件在同一目錄下  export default {  methods: {  notify() {  EventBus.$emit('child-event', 'Data from child');  }  }  
};  
</script>

在組件中監聽事件, 在另一個組件中,你可以導入 EventBus 并使用 $on 方法來監聽事件:

// ParentComponent.vue 或其他任何組件  
<script>  
import { EventBus } from './bus.js'; // 假設 bus.js 和當前文件在同一目錄下  export default {  created() {  EventBus.$on('child-event', (data) => {  console.log('Received data from child:', data);  });  },  beforeDestroy() {  // 清除事件監聽,避免內存泄漏  EventBus.$off('child-event');  }  
};  
</script>

注意,在組件銷毀(beforeDestroy 或 destroyed 鉤子)時,你應該使用 $off 方法來移除事件監聽器,以避免內存泄漏。

使用事件總線的一個缺點是它可能導致你的應用狀態變得難以追蹤,特別是當你的應用變得復雜并且有很多組件在相互通信時。因此,盡管事件總線在某些場景下很有用,但在設計你的應用架構時,也要考慮其他狀態管理解決方案,如 Vuex。

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

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

相關文章

《GPT模型揭秘:數據驅動AI的核心概念與GPT系列對比分析》

DS&#xff1a;《What Are the Data-Centric AI Concepts behind GPT Models?通過三個數據為中心的人工智能目標(訓練數據開發、推理數據開發和數據維護)揭示GPT模型背后的數據為中心的人工智能概念》解讀—GPT-1/GPT-2/GPT-3系列對比(語料大小參數量解碼層數上下文長度隱藏層…

技術學習的奧秘與樂趣

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 在當今快速發展的科技時代&#xff0c;學習技術已經成為了許多人追求的重要目標之一。無論是為了個人發展&#…

并發編程基礎概念

相關概念 并行 并行是指同一個時刻&#xff0c;多個任務同時進行。只有在多核CPU下才會發生。 并發 并發是指單個CPU在不同任務之間來換切換工作&#xff0c;但是同一時刻只有一個任務在工作。由于CPU的切換速度很快&#xff0c;給人的感受是多個任務在一起運行。 串行 串行…

Ansys Zemax|在設計抬頭顯示器(HUD)時需要使用哪些工具?

附件下載 聯系工作人員獲取附件 汽車抬頭顯示器或汽車平視顯示器&#xff0c;也被稱為HUD&#xff0c;是在汽車中顯示數據的透明顯示器&#xff0c;不需要用戶低頭就能看到他們需要的重要資訊。這個名字的由來是由于該技術能夠讓飛行員在頭部“向上”并向前看的情況下查看信息…

RocketMQ快速入門:linux安裝rocketmq并配置開機自啟(十一)

目錄 0. 引言1. 下載安裝包1.1 高版本直接下載安裝包1.2 下載源碼包進行編譯 2. namesrv和broker安裝2.1 安裝2.2 放開服務器端口2.3 測試 3. 配置開機自啟3.1 配置namesrv開機自啟3.2 配置broker開機自啟 0. 引言 之前我們針對本機電腦安裝rocketmq進行了講解&#xff0c;同時…

Java--回顧方法的定義

1.修飾符 public 公共的 修飾String類型 2.返回類型 返回的值得類型 返回值為String&#xff08;字符串&#xff09;類型 3.break continue return的區別 break&#xff0c;結束整個循環 continue&#xff0c;結束本次循環 return&#xff0c;結束整…

java用this語句調用構造方法

示例代碼如下&#xff1a; class Student7{private String name;private int age;public Student7(){System.out.println("調用了無參構造方法");}public Student7(String name,int age){this();this.namename;this.ageage;}public String read(){return"我是:…

遠程過程調用RPC實現原理

Hi~&#xff01;這里是奮斗的小羊&#xff0c;很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~~ &#x1f4a5;&#x1f4a5;個人主頁&#xff1a;奮斗的小羊 &#x1f4a5;&#x1f4a5;所屬專欄&#xff1a;C語言 &#x1f680;本系列文章為個人學習…

運算放大器輸出相位反轉和輸入過壓保護

運算放大器輸出電壓相位反轉 本教程討論兩個與運算放大器相關的話題&#xff1a;輸出相位反轉和輸入過壓保護。 超過輸入共模電壓(CM)范圍時&#xff0c;某些運算放大器會發生輸出電壓相位反轉問題。其原因通常是運算放大器的一個內部級不再具有足夠的偏置電壓而關閉&#xff…

昇思25天學習打卡營第4天|常見的數據變換 Transforms類型

導入數據集相關庫和模塊 首先導入了一些必要的庫和模塊&#xff0c;包括 numpy&#xff08;np 是其常用的別名&#xff09;、PIL 庫中的 Image 模塊&#xff0c;以及自定義的 download 模塊&#xff0c;還有 mindspore.dataset 中的 transforms、vision、text 模塊。然后使用 m…

C# 關于通訊觀察線程(2) -- 斷線重連

通訊觀察線程是個有意思&#xff0c;又是非常實用的功能。 斷線重連具體怎么實現呢&#xff0c;很多人都實現過&#xff0c;那么TouchSocket等幾個通訊組件中也包含有&#xff0c;都是可以拿來就用。只是&#xff0c;對于高級用戶和特別細節操作要求的&#xff0c;是會自定義特…

數字信號處理實驗三(IIR數字濾波器設計)

IIR數字濾波器設計&#xff08;2學時&#xff09; 要求&#xff1a; 產生一復合信號序列&#xff0c;該序列包含幅度相同的28Hz、50Hz、100Hz、150Hz的單音&#xff08;單頻&#xff09;信號&#xff1b;其中&#xff0c;50Hz及其諧波為工頻干擾&#xff08;注&#xff1a;采樣…

Chrome Extension如何讓work flow在頁面刷新、跳轉繼續執行任務

從Electron到Chrome Extension:流程自動化的跨平臺探索 在之前的項目中,我使用Electron成功實現了一個流程自動化應用,它極大地提高了工作效率。然而,當面對Chrome擴展程序(Extension)的需求時,我意識到需要一種新的策略來應對瀏覽器環境下的限制。特別是Chrome Extens…

SII9134CTU HDMI發射芯片

SII9134 HDMI深彩色發射機是第三代高清晰度多媒體接口(HDMI)發射機&#xff0c;支持HDMI 1.3規范。 這款完全符合hdmi標準的設備提供了一種簡單、低成本的方法來發送受保護的數字音頻和視頻&#xff0c;為最終用戶提供真正的全數字體驗。AV接收器&#xff0c;以及藍光和HD DVD…

2024年6月27日,歐盟REACH法規新增第31批1項SVHC高關注物質

ECHA公布第31批1項SVHC&#xff0c;物質已增至241項 2024年6月27日&#xff0c;ECHA公布第31批1項SVHC&#xff0c;總數達241項。新增物質未包括磷酸三苯酯&#xff0c;仍在評議中。REACH法規要求SVHC含量超0.1%需告知下游&#xff0c;出口超1噸須通報ECHA。SCIP通報要求SVHC含…

MySQL84 -- ERROR 1524 (HY000): Plugin ‘msql_native_password‘ is not loaded.

【問題描述】 MySQL 8.4版本&#xff0c;配置用戶使用mysql_native_password認證插件驗證用戶身份&#xff0c;報錯&#xff1a; 【解決方法】&#xff08;Windows, MySQL 8.4) 1、修改MySQL配置文件my.ini&#xff0c;在[mysqld]段添加mysql_native_passwordON。 2、管理員…

uni-app 自定義支付密碼鍵盤

1.新建最賤 payKeyboard .vue <template><view class"page-total" v-show"isShow"><view class"key-list"><view class"list" v-for"(item,index) in keyList" :class"{special:item.keyCode190…

LeetCode 53.最大子數組和(dp)

給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 子數組 是數組中的一個連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 輸出&#xff1a;…

《雁門太守行》

作者 李賀 【唐代】 全文&#xff1a; 黑云壓城城欲摧&#xff0c;甲光向日金鱗開。 角聲滿天秋色里&#xff0c;塞上燕脂凝夜紫。 半卷紅旗臨易水&#xff0c;霜重鼓寒聲不起。 報君黃金臺上意&#xff0c;提攜玉龍為君死。 提示&#xff1a; (塞上 一作&#xff1a;塞土) …

描述ifstream、ofstream和fstream類的用途

ifstream、ofstream和fstream是C標準庫<fstream>中提供的三個重要的文件流類&#xff0c;它們分別用于文件的讀取、寫入和讀寫操作。以下是這三個類的詳細用途描述&#xff1a; ifstream類&#xff08;輸入文件流類&#xff09;&#xff1a; 用途&#xff1a;ifstream類…