摘要:使用組件全局定義組件,第一個參數(shù)是組件名,的值是組件的內(nèi)容這是個待辦項(xiàng)實(shí)例化是必須的,要把使用組件的區(qū)域交給管理局部注冊組件局部注冊組件全局注冊往往是不夠理想的。
目錄
首發(fā)日期:2019-01-26
【官方的話】組件系統(tǒng)是 Vue 的另一個重要概念,因?yàn)樗且环N抽象,允許我們使用小型、獨(dú)立和通常可復(fù)用的組件構(gòu)建大型應(yīng)用。仔細(xì)想想,幾乎任意類型的應(yīng)用界面都可以抽象為一個組件樹:
小菜鳥的話:定義組件就好像定義了一堆“帶名字”的模板,比如說可能會有叫做“頂部菜單欄”的組件,我們可以多次復(fù)用這個“頂部菜單欄”而省去了大量重復(fù)的代碼。
代碼效果:
組件注冊就是“定義模板”,只有注冊了的組件,Vue才能夠了解怎么渲染。
全局注冊往往是不夠理想的。比如,如果你使用一個像 webpack 這樣的構(gòu)建系統(tǒng),全局注冊所有的組件意味著即便你已經(jīng)不再使用一個組件了,它仍然會被包含在你最終的構(gòu)建結(jié)果中。這造成了用戶下載的 JavaScript 的無謂的增加。
在這些情況下,你可以通過一個普通的 JavaScript 對象來定義組件:
上面的全局注冊說了允許在組件中使用其他組件,但注意局部注冊的組件要聲明使用其他組件才能夠嵌套其他組件。例如,如果你希望 ComponentA 在 ComponentB 中可用,則你需要這樣寫:
組件名可以使用類my-component-name(kebab-case (短橫線分隔命名))或MyComponentName的格式(PascalCase 首字母大寫命名法),使用組件的時候可以
或
,但在有些時候首字母大寫命名法定義組件的是不行的,所以通常推薦使用
【當(dāng)你使用首字母大寫命名法來定義組件的時候,不能直接在body中直接寫組件名,而要求寫在template中,如下例】。
每個組件必須只有一個根元素?。?/strong>
所以下面是不合法的:
如果你確實(shí)要有多個元素,那么要有一個根元素包裹它們:
組件也是一個實(shí)例,所以組件也可以定義我們之前在根實(shí)例中定義的內(nèi)容:data,methods,created,components等等。
但一個組件的 data 選項(xiàng)必須是一個函數(shù),因此每個實(shí)例可以維護(hù)一份被返回對象的獨(dú)立的拷貝
在一些html元素中只允許某些元素的存在,例如tbody元素中要求有tr,而不可以有其他的元素(有的話會被提到外面)。下面是一個元素被提到外面的例子【而ul并沒有太嚴(yán)格,所以我們在前面的todo-list的例子中能夠演示成功】
下圖可以看的出來div被提到table外面了:
這是為什么呢?目前來說,我們在頁面中其實(shí)是先經(jīng)過html渲染再經(jīng)過vue渲染的(后面項(xiàng)目話后是整體渲染成功再展示的),當(dāng)html渲染時,它就發(fā)現(xiàn)了tr里面有一個“非法元素”,所以它就把我們自定義的組件提到了table外面。
解決方案:
使用tr元素,元素里面有屬性is,is的值是我們要使用的組件名
但不會在一下情況中出錯: