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