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