摘要:子組件向父組件通信方法一使用事件父組件向子組件傳遞事件方法,子組件通過觸發(fā)事件,回調(diào)給父組件。非父子組件兄弟組件之間的數(shù)據(jù)傳遞非父子組件通信,官方推薦使用一個實例作為中央事件總線。
寫在前面
因為對Vue.js很感興趣,而且平時工作的技術(shù)棧也是Vue.js,這幾個月花了些時間研究學(xué)習(xí)了一下Vue.js源碼,并做了總結(jié)與輸出。
文章的原地址:https://github.com/answershuto/learnVue。
在學(xué)習(xí)過程中,為Vue加上了中文的注釋https://github.com/answershuto/learnVue/tree/master/vue-src,希望可以對其他想學(xué)習(xí)Vue源碼的小伙伴有所幫助。
可能會有理解存在偏差的地方,歡迎提issue指出,共同學(xué)習(xí),共同進步。
什么是Vue組件?組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。在有些情況下,組件也可以是原生 HTML 元素的形式,以 is 特性擴展。
使用props,父組件可以使用props向子組件傳遞數(shù)據(jù)。
父組件vue模板father.vue
子組件vue模板child.vue
{{msg}}
使用$children可以在父組件中訪問子組件。
父組件向子組件傳遞事件方法,子組件通過$emit觸發(fā)事件,回調(diào)給父組件。
父組件vue模板father.vue
子組件vue模板child.vue
這種方法只能在父組件傳遞一個引用變量時可以使用,字面變量無法達到相應(yīng)效果。因為飲用變量最終無論是父組件中的數(shù)據(jù)還是子組件得到的props中的數(shù)據(jù)都是指向同一塊內(nèi)存地址,所以修改了子組件中props的數(shù)據(jù)即修改了父組件的數(shù)據(jù)。
但是并不推薦這么做,并不建議直接修改props的值,如果數(shù)據(jù)是用于顯示修改的,在實際開發(fā)中我經(jīng)常會將其放入data中,在需要回傳給父組件的時候再用事件回傳數(shù)據(jù)。這樣做保持了組件獨立以及解耦,不會因為使用同一份數(shù)據(jù)而導(dǎo)致數(shù)據(jù)流異常混亂,只通過特定的接口傳遞數(shù)據(jù)來達到修改數(shù)據(jù)的目的,而內(nèi)部數(shù)據(jù)狀態(tài)由專門的data負責(zé)管理。
使用$parent可以訪問父組件的數(shù)據(jù)。
非父子組件通信,Vue官方推薦使用一個Vue實例作為中央事件總線。
Vue內(nèi)部有一個事件機制,可以參考源碼。
$on方法用來監(jiān)聽一個事件。
$emit用來觸發(fā)一個事件。
/*新建一個Vue實例作為中央事件總嫌*/ let event = new Vue(); /*監(jiān)聽事件*/ event.$on("eventName", (val) => { //......do something }); /*觸發(fā)事件*/ event.$emit("eventName", "this is a message.");
在Vue1.0中實現(xiàn)了$broadcast與$dispatch兩個方法用來向子組件(或父組件)廣播(或派發(fā)),當(dāng)子組件(或父組件)上監(jiān)聽了事件并返回true的時候會向爺孫級組件繼續(xù)廣播(或派發(fā))事件。但是這個方法在Vue2.0里面已經(jīng)被移除了。
之前在學(xué)習(xí)餓了么的開源組件庫element的時候發(fā)現(xiàn)他們重新實現(xiàn)了broadcast以及dispatch的方法,以mixin的方式引入,具體可以參考《說說element組件庫broadcast與dispatch》。但是跟Vue1.0的兩個方法實現(xiàn)有略微的不同。這兩個方法實現(xiàn)了向子孫組件事件廣播以及向多層級父組件事件派發(fā)的功能。但是并非廣義上的事件廣播,它需要指定一個commentName進行向指定組件名組件定向廣播(派發(fā))事件。
其實這兩個方法內(nèi)部實現(xiàn)還是用到的還是$parent以及$children,用以遍歷子節(jié)點或是逐級向上查詢父節(jié)點,訪問到指定組件名的時候,調(diào)用$emit觸發(fā)指定事件。
當(dāng)應(yīng)用足夠復(fù)雜情況下,請使用vuex進行數(shù)據(jù)管理。
關(guān)于作者:染陌
Email:answershuto@gmail.com or answershuto@126.com
Github: https://github.com/answershuto
Blog:http://answershuto.github.io/
知乎主頁:https://www.zhihu.com/people/cao-yang-49/activities
知乎專欄:https://zhuanlan.zhihu.com/ranmo
掘金: https://juejin.im/user/58f87ae844d9040069ca7507
osChina:https://my.oschina.net/u/3161824/blog
轉(zhuǎn)載請注明出處,謝謝。
歡迎關(guān)注我的公眾號
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89224.html
摘要:前端日報精選桌面通知精讀前端性能優(yōu)化備忘錄聊聊組件間通信的幾種姿勢到底該如何配置深入理解高階組件中文第期體系調(diào)研報告前端面試總結(jié)掘金技術(shù)周刊期知乎專欄從試著改進可重用做起掘金式數(shù)學(xué)作者眾成翻譯為什么企業(yè)進行數(shù)碼變革要用平臺眾成 2017-10-23 前端日報 精選 HTML5 桌面通知:Notification API精讀《2017前端性能優(yōu)化備忘錄》聊聊Vue.js組件間通信的幾種姿...
摘要:淺談中的組件一初識組件組件是最強大的功能之一。組件可以擴展元素,封裝可重用的代碼。例子我是組件我要把中的數(shù)據(jù)傳給我是組件中央事件總線我是用來接收從傳過來的數(shù)據(jù)我是中的數(shù)據(jù)我是根組件的數(shù)據(jù) 淺談 vue 中的組件 一 、初識組件 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代碼。 1、定義組件 Vue自定義組件分為兩種:全局...
摘要:本文總結(jié)了組件間通信的幾種方式,如和,以通俗易懂的實例講述這其中的差別及使用場景,希望對小伙伴有些許幫助。狀態(tài)改變提交操作方法。前言 組件是 vue.js最強大的功能之一,而組件實例的作用域是相互獨立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引用。一般來說,組件可以有以下幾種關(guān)系: showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac35bf...
摘要:本文總結(jié)了組件間通信的幾種方式,如和,以通俗易懂的實例講述這其中的差別及使用場景,希望對小伙伴有些許幫助。狀態(tài)改變提交操作方法。 前言 組件是 vue.js最強大的功能之一,而組件實例的作用域是相互獨立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引用。一般來說,組件可以有以下幾種關(guān)系:showImg(https://segmentfault.com/img/remote/146000001...
摘要:在使用的過程中,不可避免的需要組件間進行消息傳遞通信,組件間通信大體有下面幾種情況父組件向子組件通信子組件向父組件通信非嵌套組件間通信跨級組件之間通信父組件向子組件通信父組件通過向子組件傳遞,子組件得到后進行相應(yīng)的處理。 在使用 React 的過程中,不可避免的需要組件間進行消息傳遞(通信),組件間通信大體有下面幾種情況: 父組件向子組件通信 子組件向父組件通信 非嵌套組件間通信 跨...
閱讀 3117·2021-11-24 09:39
閱讀 979·2021-09-07 10:20
閱讀 2400·2021-08-23 09:45
閱讀 2273·2021-08-05 10:00
閱讀 575·2019-08-29 16:36
閱讀 840·2019-08-29 11:12
閱讀 2824·2019-08-26 11:34
閱讀 1844·2019-08-26 10:56