摘要:認(rèn)識組件組件是強大的功能之一。注意,所有的組件同時也都是的實例,可接受相同的選項對象。組件全局注冊時通過方式注冊??紤]到會出現(xiàn)禁止使用的場景,需要禁止和啟用組件的功能,所以需要。同樣也是先在子組件的選項中定義好傳遞過來的數(shù)據(jù)。
前言
Vue.js是一套構(gòu)建用戶界面的漸進式框架(官方說明)。通俗點來說,Vue.js是一個輕量級的,易上手易使用的,便捷,靈活性強的前端MVVM框架。簡潔的API,良好健全的中文文檔,使開發(fā)者能夠較容易的上手Vue框架。
本系列文章將結(jié)合個人在使用Vue中的一些經(jīng)(cai)驗(keng)和一些案例,對Vue框架掌握的部分知識進行輸出,同時也鞏固對Vue框架的理解。
認(rèn)識組件
組件是 Vue 強大的功能之一。Vue組件具有封裝可復(fù)用的特點,能夠讓你在復(fù)雜的應(yīng)用中拆分成獨立模塊使用。注意,所有的 Vue 組件同時也都是 Vue 的實例,可接受相同的選項對象。
Vue組件的注冊我們可以通過全局注冊和局部注冊的方式來注冊一個 Vue 組件,兩種方式的區(qū)別在于,全局注冊的組件能夠在任何地方使用,其實就是所有的 Vue 實例化的時候都會去渲染這個全局組件;而局部組件只是注冊在某一個 Vue 實例化對象上,只能在這個 Vue 實例化的時候會渲染,其他地方使用會被當(dāng)成普通的Html標(biāo)簽渲染。我們就先來了解下全局組件的注冊。
Vue 組件全局注冊時通過 Vue.component(tagName, options) 方式注冊。 看一個簡單的示例。
Vue.component 方法中傳入兩個參數(shù),一個參數(shù)是組件的自定義標(biāo)簽名,另一個參數(shù)是一個對象,里面的template屬性的值就是組件的模板。
可能你會想,組件的內(nèi)容太簡單了吧,只有一個標(biāo)簽,要是內(nèi)容復(fù)雜點的組件,難道也要像以前一樣用字符串把內(nèi)容都拼接起來嗎?感覺太恐怖了,就算是使用了es6的字符串語法,寫下去也是一大推,很不優(yōu)雅感覺。嗯,是的,針對這個問題,在 Vue 中給出了良好的解決方案,可以使用 標(biāo)簽來處理復(fù)雜的組件模板。
當(dāng)然,為了能夠讓代碼看起來更加清晰明了點,你可以使用 template 標(biāo)簽來包裹組件模板,template 標(biāo)簽在瀏覽器渲染過程中不會被渲染出來。
我是Button組件
好了,那么局部組件應(yīng)該怎么注冊呢?你可以通過在Vue實例選項components注冊僅在其作用域中可用的局部組件。
Vue實例選項components包含了一個屬性,鍵是組件的名稱,值是一個對象,包含了組件的模板等屬性。
使用 Prop 傳遞數(shù)據(jù)每個Vue組件實例都有獨立范圍的作用域的,這意味著子組件的模板中無法獲取到父組件的數(shù)據(jù),那么Vue可以通過使用props參數(shù)來實現(xiàn)父組件向子組件傳遞數(shù)據(jù)。
可以看到,我們定義了一個props數(shù)組接收來自父組件傳遞的數(shù)據(jù),因為父組件傳遞的數(shù)據(jù)可能是多個。而事實上,props不一定是數(shù)組,也可以是對象,可以詳細(xì)的指定父組件傳遞的數(shù)據(jù)規(guī)則,包括默認(rèn)值,數(shù)據(jù)類型等。
props: { link: { type: String, //數(shù)據(jù)類型 defalut: "https://www.baidu.com/" //默認(rèn)值 } }
那么父組件如何動態(tài)的傳遞數(shù)據(jù)給子組件呢?還記得v-bind指令的作用嗎,其作用是用于動態(tài)綁定html屬性或者是組件的props值,所以應(yīng)該使用v-bind指令來動態(tài)傳遞數(shù)據(jù)。
使用自定義事件實現(xiàn)子組件向父組件通信用戶名:{{ userName }}
性別:{{ sex }}
年齡:{{ age }}
我們知道,父組件使用 prop 傳遞數(shù)據(jù)給子組件。但子組件怎么跟父組件通信呢?這個時候 Vue 的自定義事件系統(tǒng)就派得上用場了。
假設(shè)我們在寫一個評論系統(tǒng),評論部分是Vue組件,評論提交之后我們要將評論的內(nèi)容展示出來。
先來寫出評論組件吧
提交
評論組件模板包含了一個輸入框和一個提交評論的按鈕,就這么簡單,然后,就全局注冊這個組件
Vue.component("i-comment", { template: "#comment-component", data: function(){ return { commentValue: "" } }, methods: { handleSubmit: function(){ if(this.commentValue.length < 1){ alert("評論不能為空"); return; } this.$emit("content", this.commentValue); this.commentValue = ""; } } })
可能你會發(fā)現(xiàn),組件里的data實例選項跟之前的寫法不一樣,是的,這個在寫組件的時候要注意的地方,Vue規(guī)定了組件中的data選項必須是函數(shù)。然后給提交按鈕綁定了一個點擊事件handleSubmit,當(dāng)你填寫了評論內(nèi)容,并點擊提交評論的時候,組件會通過 $emit(eventName) 觸發(fā)事件,并帶有一個參數(shù),就是把評論的內(nèi)容傳遞給父組件。
既然子組件是通過 $emit(eventName)來和父組件通信,那么父組件如何接收子組件傳遞過來的數(shù)據(jù)呢,答案是,使用 $on(eventName) 監(jiān)聽事件。
- {{ item.time }} {{ item.content }}
在父組件中,監(jiān)聽子組件中定義的事件名,并調(diào)用一個方法 commentData。commentData方法用來獲取子組件傳遞給父組件的參數(shù),這樣就是一個子組件向父組件通信的過程。 可以查看完整的例子 。
實現(xiàn)一個 Switch UI 組件接下來,通過實際動手來實現(xiàn)一個 Switch UI 組件。首先思考下Switch組件需要有哪些基本的API。
考慮到使用場景,需要制定不同尺寸的Switch組件,所以需要 size API。
考慮到會出現(xiàn)禁止使用的場景,需要禁止和啟用組件的功能,所以需要 disabled API。
考慮到需要自定義開啟和關(guān)閉時的背景顏色,所以需要 on-color 和 off-color API來自定義背景色。
同理,可能需要自定義開啟和關(guān)閉時顯示的文字,所以需要 on-text 和 off-text API來自定義顯示的文字。
可能還會需要通過事件監(jiān)聽來獲取當(dāng)前的狀態(tài),并根據(jù)狀態(tài)做一些操作,所以需要一個事件來監(jiān)聽狀態(tài)的變化,所以需要 on-change API。
那么基本的API都列出來了,現(xiàn)在就可以開始一步步實現(xiàn)這些功能了。首先寫出組件模板的基本框架。
然后得注冊這個組件吧。
var prefixClass = "vut-switch"; Vue.component("vut-switch",{ template: "#switch-component", props: { value: { type: Boolean, default: false } }, data: function(){ return { currentValue: this.value //當(dāng)前狀態(tài) } }, computed: { wrapClass: function(){ return prefixClass + "-wrap"; }, switchClass: function(){ return [ prefixClass, { [prefixClass + "-checked"]: this.currentValue } ]; } } })
基本上架子就搭建好了。 然后就開始實現(xiàn)那些列出來的API。先來看如何實現(xiàn)size尺寸。
size尺寸的值肯定是通過父組件傳遞過來的,所以就先在子組件中的props選項中定義好size對象。
props: { value: { type: Boolean, default: false }, size: String //尺寸 }
然后我們的思路是通過不同的樣式來控制渲染出來的Switch組件。我們根據(jù)傳入的不同尺寸的值來添加不同的Class值,制定不同的樣式,所以switchClass計算屬性中可這么寫:
switchClass: function(){ return [ prefixClass, { [prefixClass + "-checked"]: this.currentValue, [prefixClass +"-"+ this.size]: this.size } ]; }
然后就是添加對應(yīng)的樣式。
/*小尺寸*/ .vut-switch-small{ width: 40px; height: 20px; } .vut-switch-small:after{ width: 16px; height: 16px; } .vut-switch-small.vut-switch-checked:after{ left: 22px; } /*大尺寸*/ .vut-switch-large{ width: 60px; } .vut-switch-large.vut-switch-checked:after{ left: 38px; }
最后我們就在Vue實例初始化模板中使用Switch組件。
這樣我們就可以控制顯示Switch組件的尺寸了,效果如下:
然后來看看如何實現(xiàn)自定義背景色的。同樣也是先在子組件的props選項中定義好傳遞過來的數(shù)據(jù)。
props: { value: { type: Boolean, default: false }, size: String, //尺寸 onColor: String, //開啟時的自定義背景色 ofColor: String //關(guān)閉時的自定義背景色 }
然后我們通過當(dāng)前的狀態(tài)來控制顯示不同的背景色,也就是要關(guān)注 currentValue 值。先來寫一個設(shè)置背景色的函數(shù),根據(jù)currentValue值的變化來設(shè)置背景色。
setBackgroundColor: function(){ let customColor = this.currentValue ? this.onColor : this.offColor; this.$refs.switch.style.backgroundColor = customColor; }
然后監(jiān)聽currentValue值的變化來調(diào)用這個函數(shù)。
watch: { currentValue: function(){ this.setBackgroundColor(); } }
最后我們就在Vue實例初始化模板中使用Switch組件。
效果如下:
完整的例子請查看 switch組件 。
后記本著學(xué)習(xí)和總結(jié)的態(tài)度寫的文章,文中有任何錯誤和問題,可以在github上指出 issues 。文中的案例都放置在github上,地址:https://github.com/webproblem/IntoVue。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92164.html
摘要:引用信息將會注冊在父組件的對象上。此時對的認(rèn)識在于,元素屬性寫了,則可以通過訪問到該元素。其實用在不同位置,訪問到的東西是不一樣的。也就是說如果用在子組件上,我們還可以通過調(diào)用子組件方法。比如前提是這個組件有這個方法。 ref ref 被用來給元素或子組件注冊引用信息。引用信息將會注冊在父組件的 $refs 對象上。此時對 ref 的認(rèn)識在于,元素屬性寫了 refs, 則可以通過 th...
摘要:首先把改成的形式這是一段測試文字綁定最后的顯示效果如下,如果要看具體的形式,可以在谷歌人員開發(fā)工具中自行查看指令的組成部分經(jīng)過上面的介紹,應(yīng)該對指令有一個大概的認(rèn)識,下面就來對指令的每一項進行說明。 這篇筆記主要用來說明 Vue 中數(shù)據(jù)的定義和指令的一些特性,后續(xù)會做更深入的說明。 1.Vue中的data函數(shù) 1-1 使用data函數(shù) 由于使用的是單文件組件,因此 Vue 組件中的數(shù)據(jù)...
摘要:構(gòu)建文件清理構(gòu)建目錄下的文件打包工具編譯文件模板函數(shù)編譯與配合使用入口處理項目中的不同類型的模塊。 前言 之前有寫了一篇webpack的文章(認(rèn)識篇) 猛戳,大家對于webpack基本概念(entry,output,loader,plugin,mode...)應(yīng)該是有了較模糊的認(rèn)識.今天希望在通過(對于vue-cli的效仿)搭建一個自己的腳手架的途中對于概念會有更深刻的認(rèn)識. 目錄 1...
閱讀 4016·2021-11-18 13:22
閱讀 1836·2021-11-17 09:33
閱讀 2887·2021-09-26 09:46
閱讀 1223·2021-08-21 14:11
閱讀 2899·2019-08-30 15:53
閱讀 2721·2019-08-30 15:52
閱讀 1933·2019-08-30 10:52
閱讀 1531·2019-08-29 15:30