Vue 父子組件間的通信

前言 在 Vue 項目中父子組件的通信是非常常見的,最近做項目的時候發現對這方面的知識還不怎么熟練,在這邊做一下筆記,系統學習一下吧。

1 父組件傳值給子組件

1.1 傳值寫法

父組件傳值給子組件,這個就比較常見了,直接用 props 就可以了。但是就算是 props 子組件那邊也有三種寫法,如下面代碼所示:
父組件

```<!-- 兩種情況 --> <!--靜態傳值--> <child name="xhm"></child> <!--動態傳值--> <child :name="userName"></child> ```

子組件


// 1 簡單粗暴就給個名稱的情況
props:['name'],
// 2 給個名稱順便指定個類型,如果父組件傳遞過來的值類型不對的話就會報錯
props:{name:String
},
// 3 給個名稱不僅指定了類型,還順便送了個默認值,當父組件傳個空過來或者啥都沒傳過來的時候就用默認值了
props: {name: {type: String,default: 'xhm',}
},

注意一下的話,如果是數組或者是對象要默認值的話,直接設置默認數組或者默認對象會報錯,需要用工廠函數返回,如下:


props: {arr:{type:Array,default:()=&gt;{return [1,2,3]}}
},
// 對象也是和上面一個用工廠函數

1.2 子組件使用父組件的值

由于單向數據流的限制,我們不能直接在子組件中修改 props 的值,當我們修改的時候會報錯,官方的說法是:

所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。這樣會防止從子組件意外改變父級組件的狀態,從而導致你的應用的數據流向難以理解。

額外的,每次父級組件發生更新時,子組件中所有的 prop 都將會刷新為最新的值。這意味著你不應該在一個子組件內部改變 prop。如果你這樣做了,Vue 會在瀏覽器的控制臺中發出警告。

所以啊,如果你不只是想在子組件中簡單的渲染父組件傳過來的值的話,那么可以用下面的兩種方法。

  1. 這個 prop 用來傳遞一個初始值;這個子組件接下來希望將其作為一個本地的 prop 數據來使用。在這種情況下,最好定義一個本地的 data 屬性并將這個 prop 用作其初始值:

props: ['name'],
data() {return {userName:this.name,};
},
  1. 這個 prop 以一種原始的值傳入且需要進行轉換。在這種情況下,最好使用這個 prop 的值來定義一個計算屬性:

props: ['name'],
computed: {userName(){return this.firstName + this.name}
},

2 子組件傳值給父組件

雖然我們說是要單向數據流,但是很多時候,我們在子組件改變了某些值之后,還是要反饋給父組件,讓父組件做一下修改,那么這個時候就要想著子組件向父組件傳值啦。有下面這么兩種方式

2.1 emit 方法

這個基本都是用 emit 來傳遞了,用法直接看代碼吧:
子組件


// props:['name]// methods 里
update(){this.$emit('update','ljy');// 第一個參數:事件名,第二個參數:傳遞給事件方法的參數
}

父組件

/* template 里面的代碼,監聽子組件里面的 update 事件,調用父組件的 childUpdate 方法&lt;child :name="userName" @update="childUpdate"&gt;&lt;/child&gt;*/
// methods
chidlUpdate(val){// val 參數就是子組件傳遞過來的數據this.userName = val;
}

雖然這樣是可以實現子組件向父組件傳值,但是寫多一個方法感覺很煩,所以 vue 官方高出了一個 以 update:myPropName 的模式觸發事件。,這個是啥,舉個例子,我們的子組件中有一個 name 的 props,我們用下面這個形式通知父組件


this.$emit('update:name', newName)
// this.$emit('update:props中的變量名', 新的值)

然后父組件可以監聽那個事件并根據需要更新一個本地的數據屬性:

```<child :name="userName" @update:name="userName = $event"></child> ```

這樣當我們在子組件觸發那個修改的方法的時候,父組件的 userName 變量就會更新為 newName了,然后為了方便起見,官方提供了一個縮寫,即 .sync 修飾符。看代碼吧:

```<child :name.sync="userName"></child> ```

上面的代碼和前面的代碼是一個效果,是不是方便了很多。舒服了吧。

2.2 利用淺拷貝(不推薦)

這個的話是針對于 對象和數組那些引用類型的數據而言的,由于這些存在淺拷貝的問題(不明白淺拷貝的看這篇文章),所以可以利用這點來實現子父組件的「同生共死」,看代碼吧


// 假設 name 是一個對象或者數組
props:['name'],
return {userName:this.name,
};

就這樣?!

沒錯就是這么簡單粗暴,由于淺拷貝的問題,我們在子組件修改 userName 的時候,從父組件傳遞過來的那個值也會改變的,然后就會實現 props 的「雙向綁定」了。但是一般沒人會這么干,因為這樣會造成維護上的問題,會讓人覺得咋沒干啥父組件的值咋就變了,會讓人頭禿啊,所以除非你項目中非得要搞這么一個子父組件 props 的「同生共死」,那就這么干吧。

3 子組件調用父組件的方法

不知道這樣的叫法對不對,反正就這樣啦。總結之后又下面這幾種方法

3.1 emit

其實本來 emit 就是用于子組件向父組件通信的,上面的子組件傳值給父組件其實也就是父組件監聽子組件的事件,然后觸發父組件的方法的,換個說法,也就是子組件調用了父組件的方法,再寫一下代碼吧:

子組件


// methods 里
update(){this.$emit('update','ljy');// 第一個參數:事件名,第二個參數:傳遞給事件方法的參數
}

父組件

/* template 里面的代碼,監聽子組件里面的 update 事件,調用父組件的 childUpdate 方法&lt;child :name="userName" @update="childUpdate"&gt;&lt;/child&gt;*/
// methods
chidlUpdate(val){// val 參數就是子組件傳遞過來的數據this.userName = val;
}

上面的代碼中,從某種意義上來說,就是子組件調用了父組件的 childUpdate 方法。

3.2 this.$paarent.event

這個就比較簡單了,我們假設我們在父組件定義了一個 fatherMethod() 方法,然后我們子組件就可以通過下面的代碼實現調用 fatherMethod() 的方法


childClick(){this.$parent.fatherMethod();
}

3.3 props

props 能傳遞 Function 類型的數據,所以,我們通過 props 當然也是可以直接的調用父組件傳遞過來的方法啦。不多說,直接擼代碼:
父組件

```<!-- 假設父組件里定義了一個 fatherMethod() 方法 --> <child :fatherMethod="fatherMethod"></child> ```

子組件


props: {fatherMethod: {type: Function,default: null}
},
methods: {childClick() {this.fatherMethod();}
},

這樣我們也是調用了父組件的方法啦。

4 父組件調用子組件的方法

這個,暫時沒有遇到過這種情況,不過以備不時之需,也寫一下吧。父組件調用子組件的方法的話是利用 ref 獲取到子組件實例,從而調用子組件的方法,假設我們子組件有這么一個 childMethod() 方法。那么我們的父組件就可以這么來調用子組件的方法了


/* &lt;child ref="con"&gt;&lt;/child&gt; 子組件 */methods: {update() {this.$refs.con.childMethod();},
}

至此,關于父子組件通信的的話題就聊到這邊了,如果有啥錯誤或者遺漏的,歡迎在下面斧正啦。

原文地址:https://segmentfault.com/a/1190000017346476

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

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

相關文章

夜視儀

國民兵所用F-16的駕駛艙&#xff0c;機員配有夜視鏡以備觀察領空的客機或飛行物體使用夜視鏡時看到的影像夜視儀〈night vision device&#xff0c;簡稱NVD〉&#xff0c;也稱夜視鏡&#xff0c;是透過光學科技強化黑暗中光源的科技裝置&#xff0c;通常用于軍事用途。目前在民…

【物理/數學】—— 概念的理解 moment、momentum

moment&#xff1a;矩&#xff0c;momentum&#xff1a;[物] 動量&#xff1b;動力&#xff1b;沖力&#xff1b; 數學意義上的 moment&#xff08;矩&#xff09;概念其實源自于物理范疇。首先我們來介紹物理學意義上的矩&#xff08;Momentum&#xff09;的概念。 1. 物理學意…

JAVA多線程實現的三種方式

JAVA多線程實現方式主要有三種&#xff1a;繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。 其中前兩種方式線程執行完后都沒有返回值&#xff0c;只有最后一種是帶返回值的。 前兩種省略&#xff0c;著重看看第三種&#xff…

2springboot:快速創建springboot項目

使用IDEA快速創建springboot項目流程&#xff1a; 創建新的項目選擇 項目的命名以及包名 需要什么包就導入什么包 進行測試的單元 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>&…

如何做好渠道銷售?

作者&#xff1a;路人李志強鏈接&#xff1a;https://www.zhihu.com/question/19689177/answer/28508799來源&#xff1a;知乎著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。作為一名一線品牌的渠道銷售&#xff0c;如何讓代理商放棄其他小品…

2017浙江省賽 B - Problem Preparation ZOJ - 3959

地址&#xff1a;http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode3959 題目&#xff1a; Its time to prepare the problems for the 14th Zhejiang Provincial Collegiate Programming Contest! Almost all members of Zhejiang University programming conte…

jQuery導入代碼片段并綁定事件

a.html <div><button class"button" >點我達</button> </div> b.html <html> <head><script type"text/javascript" src"./js/jquery-1.0.1.js"></script><meta http-equiv"Content-Ty…

驗證碼識別

基于Keras&#xff0c;識別簡單的4位字符的驗證碼。 https://github.com/ypwhs/captcha_break

LinCode落單的數

easy 落單的數 查看執行結果 60% 通過給出2*n 1 個的數字&#xff0c;除當中一個數字之外其它每一個數字均出現兩次。找到這個數字。 您在真實的面試中是否遇到過這個題&#xff1f; Yes例子 給出 [1,2,2,1,3,4,3]。返回 4 挑戰 一次遍歷&#xff0c;常數級的額外空間復雜度…

漢邦高科范俊峰:關于透霧攝像機那點事

慧聰安防網訊 生活在北方的人們&#xff0c;隔三差五就和霧霾來一次親密接觸&#xff0c;霧霾對人們的出行和交通有很大的影響&#xff0c;霧霾籠罩之下&#xff0c;人們出行如果闖紅燈、車輛違規行駛發生交通事故&#xff0c;交通監控攝像頭只能“霧里看花”&#xff0c;透霧攝…

SpringBoot注解大全(轉)

原文鏈接&#xff1a;[springBoot系列]--springBoot注解大全 一、注解(annotations)列表 SpringBootApplication&#xff1a;包含了ComponentScan、Configuration和EnableAutoConfiguration注解。其中ComponentScan讓spring Boot掃描到Configuration類并把它加入到程序上下文。…

祭奠我的2018

提前寫這篇文章&#xff0c;是因為深深的感覺到自己的無能 18年伊始&#xff0c;在浪潮干了大半年的我 還沉醉在深深的滿足感中&#xff0c;感覺自己對工作游刃有余 那種自大和自我滿足感充斥著我的心態 已經變得不會學習了 后來有一次機遇&#xff0c;讓我有了跳出舒適的機會 …

工業攝像頭傳感器尺寸與像元尺寸的關系

http://www.mv186.com/show-list.php?id462 在機器自動化行業檢測應用中&#xff0c;工業攝像頭是必備的硬件&#xff0c;而圖像傳感器又是工業攝像頭中最最關鍵核心的東西。圖像傳感器的尺寸&#xff08;靶面大小&#xff09;&#xff0c;往往直接關系到成像的質量。通常來講…

CF-798B

B. Mike and stringstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputMike has n strings s1,?s2,?...,?sn each consisting of lowercase English letters. In one move he can choose a string si, erase the fi…

微信小程序倒計時實現

思路&#xff1a;跟一般js倒計時一樣&#xff0c;主要在于this的變相傳遞。 實現效果&#xff1a; wxml文件部分代碼&#xff1a; common.js文件 : 引用頁JS文件: PS: 1.在data里初始化時間格式&#xff0c;是避免時間加載的第1秒顯示為空白&#xff0c;因為setTimeOut是在1s以…

基于Kubeadm的Flannel分析

Flannel概述 Flannel是將多個不同子網&#xff08;基于主機Node&#xff09;通過被Flannel維護的Overlay網絡拼接成為一張大網來實現互聯的&#xff0c;通過官方的一張網絡拓撲圖我們可以對其基本原理一目了然&#xff1a; 值得探討的是&#xff0c;flannel的這個overlay網絡支…

sensor的skipping and binning 模式

1、第一種理解 關于sensor的縮放存在兩種模式 binning mode 和skip mode skipping mode 就是把想要的數據采集上來 把其余的數據扔掉 如下所示 column skip 2 row skip 2 留下的就是白色的像素 黑色的像素丟掉。 binning mode 就是把相鄰的像素合成一個像素&#xff0c;然后再…

5 結構型模式之 - 適配器模式

5 結構型模式之 - 適配器模式 適配器模式的介紹&#xff1a;適配器模式在開發中使用率很高&#xff0c;適配器是將兩個不兼容的類融合在一起&#xff0c;它有點像粘合劑&#xff0c;將不同的東西通過一種轉換使得它們能夠協作起來。例如經常碰到兩個不相關的類之間進行交互&…

Android進程保活

凡是做過幾年Android開發的&#xff0c;都不能不面對進程保活這一問題。特別是這兩年&#xff0c;面對谷歌&#xff0c;國內定制ROM&#xff0c;安全軟件等多方圍剿的情況下&#xff0c;app在后臺保活的難度越來越大&#xff0c;可以說包括QQ、微信在內的所有app&#xff0c;都…

治安卡口攝像機與電警抓拍機之間有什么區別?

接下來小編和大家說說它們有哪些相同和不同的地方&#xff0c;供大家參考。 治安卡口&#xff1a; 卡口攝像機主要是用于城市道路或高速公路出入口、收費站等重點治安監控地段的全天候實時檢測與記錄收費站、交通或治安檢查站等地點。 治安卡口監控系統的前端部分主要由三個單元…