摘要:使用組件全局定義組件,第一個(gè)參數(shù)是組件名,的值是組件的內(nèi)容這是個(gè)待辦項(xiàng)實(shí)例化是必須的,要把使用組件的區(qū)域交給管理局部注冊(cè)組件局部注冊(cè)組件全局注冊(cè)往往是不夠理想的。
目錄
首發(fā)日期:2019-01-26
【官方的話】組件系統(tǒng)是 Vue 的另一個(gè)重要概念,因?yàn)樗且环N抽象,允許我們使用小型、獨(dú)立和通??蓮?fù)用的組件構(gòu)建大型應(yīng)用。仔細(xì)想想,幾乎任意類型的應(yīng)用界面都可以抽象為一個(gè)組件樹:
小菜鳥的話:定義組件就好像定義了一堆“帶名字”的模板,比如說(shuō)可能會(huì)有叫做“頂部菜單欄”的組件,我們可以多次復(fù)用這個(gè)“頂部菜單欄”而省去了大量重復(fù)的代碼。
代碼效果:
組件注冊(cè)就是“定義模板”,只有注冊(cè)了的組件,Vue才能夠了解怎么渲染。
全局注冊(cè)往往是不夠理想的。比如,如果你使用一個(gè)像 webpack 這樣的構(gòu)建系統(tǒng),全局注冊(cè)所有的組件意味著即便你已經(jīng)不再使用一個(gè)組件了,它仍然會(huì)被包含在你最終的構(gòu)建結(jié)果中。這造成了用戶下載的 JavaScript 的無(wú)謂的增加。
在這些情況下,你可以通過(guò)一個(gè)普通的 JavaScript 對(duì)象來(lái)定義組件:
上面的全局注冊(cè)說(shuō)了允許在組件中使用其他組件,但注意局部注冊(cè)的組件要聲明使用其他組件才能夠嵌套其他組件。例如,如果你希望 ComponentA 在 ComponentB 中可用,則你需要這樣寫:
組件名可以使用類my-component-name(kebab-case (短橫線分隔命名))或MyComponentName的格式(PascalCase 首字母大寫命名法),使用組件的時(shí)候可以
或
,但在有些時(shí)候首字母大寫命名法定義組件的是不行的,所以通常推薦使用
【當(dāng)你使用首字母大寫命名法來(lái)定義組件的時(shí)候,不能直接在body中直接寫組件名,而要求寫在template中,如下例】。
每個(gè)組件必須只有一個(gè)根元素??!
所以下面是不合法的:
如果你確實(shí)要有多個(gè)元素,那么要有一個(gè)根元素包裹它們:
組件也是一個(gè)實(shí)例,所以組件也可以定義我們之前在根實(shí)例中定義的內(nèi)容:data,methods,created,components等等。
但一個(gè)組件的 data 選項(xiàng)必須是一個(gè)函數(shù),因此每個(gè)實(shí)例可以維護(hù)一份被返回對(duì)象的獨(dú)立的拷貝
在一些html元素中只允許某些元素的存在,例如tbody元素中要求有tr,而不可以有其他的元素(有的話會(huì)被提到外面)。下面是一個(gè)元素被提到外面的例子【而ul并沒(méi)有太嚴(yán)格,所以我們?cè)谇懊娴膖odo-list的例子中能夠演示成功】
下圖可以看的出來(lái)div被提到table外面了:
這是為什么呢?目前來(lái)說(shuō),我們?cè)陧?yè)面中其實(shí)是先經(jīng)過(guò)html渲染再經(jīng)過(guò)vue渲染的(后面項(xiàng)目話后是整體渲染成功再展示的),當(dāng)html渲染時(shí),它就發(fā)現(xiàn)了tr里面有一個(gè)“非法元素”,所以它就把我們自定義的組件提到了table外面。
解決方案:
使用tr元素,元素里面有屬性is,is的值是我們要使用的組件名
但不會(huì)在一下情況中出錯(cuò):
在上面定義的組件中使用的數(shù)據(jù)都是固定的數(shù)據(jù),通常我們都希望模板能根據(jù)我們傳入的數(shù)據(jù)來(lái)顯示。
(子組件的意思是當(dāng)前組件的直接子組件,在目前的單個(gè)html文件為例時(shí),你可以僅認(rèn)為是當(dāng)前頁(yè)面的非嵌套組件。后面講到多個(gè)組件的合作時(shí)由于多個(gè)組件之間的嵌套,就形成了組件的父子、祖孫、兄弟關(guān)系)
要給子組件傳遞數(shù)據(jù)主要有兩個(gè)步驟
演示代碼如下:
代碼效果:很明顯的,我們的值成功傳給子組件了。
$emit()
可以有多個(gè)參數(shù),第一個(gè)參數(shù)是觸發(fā)的事件的名稱,后面的參數(shù)都是隨著這個(gè)事件向外拋出的參數(shù)。演示代碼如下:
【小tips:上面有多重字符串的使用,普通的雙引號(hào)和單引號(hào)已經(jīng)不足以嵌套使用了,在外層可以使用反引號(hào)` ` `【esc下面那個(gè)鍵】來(lái)包裹,它也可以達(dá)到字符串包裹的效果,特別的是它支持多行字符串?!?/p>
祖孫組件傳數(shù)據(jù)、兄弟組件傳數(shù)據(jù)都屬于非父子組件之間的傳值。
使用bus傳輸數(shù)據(jù)的步驟:
Vue.prototype.bus = new Vue()
this.bus.$emit(change,當(dāng)前組件的數(shù)據(jù))
this.bus.$on(change,一個(gè)用于賦值的函數(shù))
下面的代碼是點(diǎn)擊某個(gè)組件發(fā)生數(shù)據(jù)變化時(shí),另一個(gè)組件的數(shù)據(jù)也發(fā)生變化:
【有個(gè)建議,建議寫屬性名的時(shí)候都使用kebab-case (短橫線分隔命名) 命名,因?yàn)檫@個(gè)的兼容效果最好】
HTML 中的特性名是大小寫不敏感的,所以瀏覽器會(huì)把所有大寫字符解釋為小寫字符。如果你在props中使用了駝峰命名法,那你在定義屬性的時(shí)候需要使用kebab-case (短橫線分隔命名) 命名才能正確傳輸數(shù)據(jù)【因?yàn)槎虣M線后面的字符可以識(shí)別成大寫,從而能夠匹配到】。
如果在屬性中也使用駝峰命名法命名屬性的時(shí)候會(huì)報(bào)這樣的錯(cuò):Prop "mycontent" is passed to component , but the declared prop name is "myContent". Note that HTML attributes are case-insensitive and camelCased props need to use their kebab-case equivalents when using in-DOM templates. You should probably use "my-content" instead of "myContent"
同樣的,如果在組件的template屬性中使用駝峰命名法的屬性,那么這個(gè)限制就不存在了。
有時(shí)候需要使用第三方的組件的時(shí)候,所以會(huì)需要傳輸數(shù)據(jù)給這個(gè)組件來(lái)渲染。但如何限制傳入的數(shù)據(jù)的類型呢?
格式:
props: {
// 數(shù)據(jù)名:數(shù)據(jù)類型
title: String,
likes: Number,
...
}
如果傳入的類型不對(duì),那么會(huì)報(bào)Invalid prop: type check failed for prop "xxx". Expected String with value "xxx", got Number with value xxx.
的錯(cuò)誤。
如果允許多種值,可以定義一個(gè)數(shù)組:
props: {
content: [String,Number]
}
我們也可以給props中的數(shù)據(jù)設(shè)置默認(rèn)值,如果使用default設(shè)置值,那么沒(méi)有傳某個(gè)數(shù)據(jù)時(shí)默認(rèn)使用這個(gè)數(shù)據(jù)。
props: {
content: {
type:[String,Number],
default:'我的默認(rèn)值'
}
}
如果使用default給數(shù)組或?qū)ο箢愋偷臄?shù)據(jù)賦默認(rèn)值,那么要定義成一個(gè)函數(shù)。
如果要求某個(gè)數(shù)據(jù)必須傳給子組件,那么可以為它設(shè)置required。
格式:
props: {
content: {
type: String,
required: true
}
}
如果沒(méi)傳,會(huì)報(bào)Missing required prop: "xxx"
的錯(cuò)。
如果想要更精確的校驗(yàn),可以使用validator,里面是一個(gè)函數(shù),函數(shù)的第一個(gè)參數(shù)就是傳入的值,當(dāng)函數(shù)內(nèi)返回true時(shí),這個(gè)值才會(huì)校驗(yàn)通過(guò)。
以下的代碼是要求傳入的字符串長(zhǎng)度大于6位的校驗(yàn):
Vue.component('child', {
props: {
content: {
type: String,
validator: function(value) {
return (value.length > 6)
}
}
}
如果驗(yàn)證不通過(guò),會(huì)報(bào)Invalid prop: custom validator check failed for prop "xxx"
的錯(cuò)。
用下面的代碼來(lái)說(shuō)一個(gè)問(wèn)題:
demo
上面的代碼你會(huì)發(fā)現(xiàn)點(diǎn)擊了按鈕卻沒(méi)有調(diào)用函數(shù)。
而下面的按鈕按了會(huì)打出child。
demo
下面的代碼是使用了emit來(lái)達(dá)到同樣效果的代碼:
demo
元素當(dāng)做不可見(jiàn)的包裹元素,讓成組的元素能夠統(tǒng)一被渲染出來(lái)。
元素當(dāng)做不可見(jiàn)的包裹元素
Title
Paragraph 1
Paragraph 2
- {{ item.msg }}
插槽也可以分發(fā)多份數(shù)據(jù)。使用指定的插槽名就可以獲取指定的插槽數(shù)據(jù)。
如果沒(méi)有數(shù)據(jù)傳過(guò)來(lái),那么插槽可以定義一個(gè)默認(rèn)的數(shù)據(jù)用來(lái)顯示。
{{props.index}}
如果改變了is屬性的值,那么渲染的組件就會(huì)發(fā)生變化。下面是上圖的演示代碼:
下面以上面的動(dòng)態(tài)組件切換為例:
如果給上面的登錄組件都加上一個(gè)created用來(lái)顯示渲染次數(shù)的話,我們就可以看到是不是每次切換都會(huì)重新渲染。
如果加了keep-alive之后不再重復(fù)輸出,那么就說(shuō)明組件被緩存了。
1.在元素中使用ref屬性給元素起一個(gè)有標(biāo)識(shí)意義的名字。
2.this.(refs可以獲取當(dāng)前組件實(shí)例的所有使用了ref的元素,`this.)refs.名字`代表指定的元素。
3.然后你可以進(jìn)行dom操作了。
1
refs也可以用在組件上,可以獲取組件的數(shù)據(jù)(但這時(shí)候的ref獲取的不是一個(gè)dom對(duì)象,而是一個(gè)vue實(shí)例對(duì)象,所以不能獲取innerText這類dom屬性)。
如果說(shuō)前面講的都是基礎(chǔ),必須要掌握的話,那么動(dòng)畫效果是錦上添花,可有可無(wú)(對(duì)于我這些不追求動(dòng)畫效果就不顯得重要了),所以這里就不講了,這里僅僅是為了顯示vue能有實(shí)現(xiàn)動(dòng)畫效果的功能。
有興趣的可以看一下官網(wǎng):
vue官網(wǎng)動(dòng)畫效果直通車
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/1262.html
摘要:比如把示例中的數(shù)據(jù)在頁(yè)面中用顯示出來(lái)與輸入框的數(shù)據(jù)綁定表單輸入框有這個(gè)值,在表單輸入框里使用會(huì)把表單輸入框與實(shí)例的數(shù)據(jù)進(jìn)行智能綁定為什么說(shuō)智能,因?yàn)橛行┹斎肟虻臄?shù)據(jù)是屬性,有些不是。目錄上篇內(nèi)容回顧:數(shù)據(jù)綁定表單輸入框綁定單行文本輸入框多行文本輸入框復(fù)選框checkbox單選框radio選擇框select數(shù)據(jù)綁定的修飾符.lazy.number.trim樣式綁定class綁定對(duì)象語(yǔ)法:數(shù)組語(yǔ)...
摘要:如果我們作為一個(gè)后端開(kāi)發(fā)者想掌握一個(gè)前端框架,是一個(gè)好選擇,因?yàn)樗銐虻囊讓W(xué)。是語(yǔ)言的下一代標(biāo)準(zhǔn)。數(shù)據(jù)方法生命周期鉤子函數(shù)其他有些內(nèi)容比較重要,留到后面講定義數(shù)據(jù)定義數(shù)據(jù)定義了數(shù)據(jù),那么就可以在管理的區(qū)域中使用的獲取數(shù)據(jù)的語(yǔ)法來(lái)獲取數(shù)據(jù)。目錄 前言: iview組件庫(kù)示例 element組件庫(kù)示例 ...
摘要:一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰傳統(tǒng)前端生態(tài)初級(jí)不使用打包中間處理工具,手工處理圖片等資源掌握以下知識(shí)點(diǎn)基礎(chǔ)結(jié)構(gòu),基礎(chǔ)樣式,基礎(chǔ)語(yǔ)法框架,系列插件框架,等基礎(chǔ)插件,等其他移動(dòng)端適配,瀏覽器兼容,瀏覽器調(diào)試等恭喜完成新手村修 一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰~ 傳統(tǒng)前端生態(tài)-初級(jí) 不使用打包、中間處理工具,手工處理js、css、圖片等資源 掌握以下知識(shí)點(diǎn):...
摘要:一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰傳統(tǒng)前端生態(tài)初級(jí)不使用打包中間處理工具,手工處理圖片等資源掌握以下知識(shí)點(diǎn)基礎(chǔ)結(jié)構(gòu),基礎(chǔ)樣式,基礎(chǔ)語(yǔ)法框架,系列插件框架,等基礎(chǔ)插件,等其他移動(dòng)端適配,瀏覽器兼容,瀏覽器調(diào)試等恭喜完成新手村修 一步,兩步,三步四步五步,就這樣到達(dá)了人生的巔峰~ 傳統(tǒng)前端生態(tài)-初級(jí) 不使用打包、中間處理工具,手工處理js、css、圖片等資源 掌握以下知識(shí)點(diǎn):...
閱讀 844·2023-04-25 19:43
閱讀 4109·2021-11-30 14:52
閱讀 3920·2021-11-30 14:52
閱讀 4024·2021-11-29 11:00
閱讀 3918·2021-11-29 11:00
閱讀 4036·2021-11-29 11:00
閱讀 3752·2021-11-29 11:00
閱讀 6599·2021-11-29 11:00