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