摘要:組件名在注冊(cè)一個(gè)組件的時(shí)候,我們始終需要給它一個(gè)名字。局部注冊(cè)全局注冊(cè)往往是不夠理想的。基礎(chǔ)組件的自動(dòng)化全局注冊(cè)可能你的許多組件只是包裹了一個(gè)輸入框或按鈕之類(lèi)的元素,是相對(duì)通用的。記住全局注冊(cè)的行為必須在根實(shí)例通過(guò)創(chuàng)建之前發(fā)生。
1、組件名
在注冊(cè)一個(gè)組件的時(shí)候,我們始終需要給它一個(gè)名字。
Vue.component("my-component-name", { /* ... */ })
該組件名就是 Vue.component 的第一個(gè)參數(shù)。
當(dāng)直接在 DOM 中使用一個(gè)組件 (而不是在字符串模板或單文件組件) 的時(shí)候,強(qiáng)烈推薦遵循 W3C 規(guī)范中的自定義組件名 (字母全小寫(xiě)且必須包含一個(gè)連字符)。這會(huì)幫助你避免和當(dāng)前以及未來(lái)的 HTML 元素相沖突。
定義組件名的方式有兩種:
(1)使用 kebab-case(短橫線分隔命名)
Vue.component("my-component-name", { /* ... */ })
當(dāng)使用 kebab-case (短橫線分隔命名) 定義一個(gè)組件時(shí),你也必須在引用這個(gè)自定義元素時(shí)使用 kebab-case,例如
(2)使用 PascalCase (首字母大寫(xiě)命名)
Vue.component("MyComponentName", { /* ... */ })
當(dāng)使用 PascalCase (首字母大寫(xiě)命名) 定義一個(gè)組件時(shí),你在引用這個(gè)自定義元素時(shí)兩種命名法都可以使用。也就是說(shuō)
到目前為止,我們只用過(guò) Vue.component 來(lái)創(chuàng)建組件:
Vue.component("my-component-name", { // ... 選項(xiàng) ... })
這些組件是全局注冊(cè)的。也就是說(shuō)它們?cè)谧?cè)之后可以用在任何新創(chuàng)建的 Vue 根實(shí)例 (new Vue) 的模板中。比如:
Vue.component("component-a", { /* ... */ }) Vue.component("component-b", { /* ... */ }) Vue.component("component-c", { /* ... */ }) new Vue({ el: "#app" })
在所有子組件中也是如此,也就是說(shuō)這三個(gè)組件在各自內(nèi)部也都可以相互使用。
3、局部注冊(cè)全局注冊(cè)往往是不夠理想的。比如,如果你使用一個(gè)像 webpack 這樣的構(gòu)建系統(tǒng),全局注冊(cè)所有的組件意味著即便你已經(jīng)不再使用一個(gè)組件了,它仍然會(huì)被包含在你最終的構(gòu)建結(jié)果中。這造成了用戶下載的 JavaScript 的無(wú)謂的增加。
在這些情況下,可以通過(guò)一個(gè)普通的 JavaScript 對(duì)象來(lái)定義組件:
var ComponentA = { /* ... */ } var ComponentB = { /* ... */ } var ComponentC = { /* ... */ }
然后在 components 選項(xiàng)中定義你想要使用的組件:
new Vue({ el: "#app", components: { "component-a": ComponentA, "component-b": ComponentB } })
對(duì)于 components 對(duì)象中的每個(gè)屬性來(lái)說(shuō),其屬性名就是自定義元素的名字,其屬性值就是這個(gè)組件的選項(xiàng)對(duì)象。注意局部注冊(cè)的組件在其子組件中不可用。例如,如果你希望 ComponentA 在 ComponentB 中可用,則需要這樣寫(xiě):
var ComponentA = { /* ... */ } var ComponentB = { components: { "component-a": ComponentA }, // ... }
或者如果你通過(guò) Babel 和 webpack 使用 ES2015 模塊,那么代碼看起來(lái)更像:
import ComponentA from "./ComponentA.vue" export default { components: { ComponentA }, // ... }
注意在 ES2015+ 中,在對(duì)象中放一個(gè)類(lèi)似 ComponentA 的變量名其實(shí)是 ComponentA: ComponentA 的縮寫(xiě),即這個(gè)變量名同時(shí)是:
用在模板中的自定義元素的名稱(chēng); 包含了這個(gè)組件選項(xiàng)的變量名
在這些情況下,我們推薦創(chuàng)建一個(gè) components 目錄,并將每個(gè)組件放置在其各自的文件中。
然后你需要在局部注冊(cè)之前導(dǎo)入每個(gè)你想使用的組件。例如,在一個(gè)假設(shè)的 ComponentB.js 或
ComponentB.vue 文件中: import ComponentA from "./ComponentA" import ComponentC from "./ComponentC" export default { components: { ComponentA, ComponentC }, // ... }
現(xiàn)在 ComponentA 和 ComponentC 都可以在 ComponentB 的模板中使用了。
4.2基礎(chǔ)組件的自動(dòng)化全局注冊(cè)可能你的許多組件只是包裹了一個(gè)輸入框或按鈕之類(lèi)的元素,是相對(duì)通用的。我們有時(shí)候會(huì)把它們稱(chēng)為基礎(chǔ)組件,它們會(huì)在各個(gè)組件中被頻繁的用到。
所以會(huì)導(dǎo)致很多組件里都會(huì)有一個(gè)包含基礎(chǔ)組件的長(zhǎng)列表:
import BaseButton from "./BaseButton.vue" import BaseIcon from "./BaseIcon.vue" import BaseInput from "./BaseInput.vue" export default { components: { BaseButton, BaseIcon, BaseInput } }
而只是用于模板中的一小部分:
幸好如果你使用了 webpack (或在內(nèi)部使用了 webpack 的 Vue CLI 3+),那么就可以使用require.context 只全局注冊(cè)這些非常通用的基礎(chǔ)組件。這里有一份可以讓你在應(yīng)用入口文件 (比如 src/main.js) 中全局導(dǎo)入基礎(chǔ)組件的示例代碼:
import Vue from "vue" import upperFirst from "lodash/upperFirst" import camelCase from "lodash/camelCase" const requireComponent = require.context( // 其組件目錄的相對(duì)路徑 "./components", // 是否查詢其子目錄 false, // 匹配基礎(chǔ)組件文件名的正則表達(dá)式 /Base[A-Z]w+.(vue|js)$/ ) requireComponent.keys().forEach(fileName => { // 獲取組件配置 const componentConfig = requireComponent(fileName) // 獲取組件的 PascalCase 命名 const componentName = upperFirst( camelCase( // 獲取和目錄深度無(wú)關(guān)的文件名 fileName .split("/") .pop() .replace(/.w+$/, "") ) ) // 全局注冊(cè)組件 Vue.component( componentName, // 如果這個(gè)組件選項(xiàng)是通過(guò) `export default` 導(dǎo)出的, // 那么就會(huì)優(yōu)先使用 `.default`, // 否則回退到使用模塊的根。 componentConfig.default || componentConfig ) })
記住全局注冊(cè)的行為必須在根 Vue 實(shí)例 (通過(guò) new Vue) 創(chuàng)建之前發(fā)生。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105506.html
摘要:父子組件通信父組件通過(guò)向下傳遞數(shù)據(jù)給子組件,子組件通過(guò)給父組件發(fā)送消息。是一個(gè)對(duì)象而不是字符串?dāng)?shù)組時(shí),它包含驗(yàn)證要求。狀態(tài)管理由于多個(gè)狀態(tài)分散的跨越在許多組件和交互間,大型應(yīng)用的復(fù)雜度也隨之增長(zhǎng)。提供了,可以通過(guò)文檔學(xué)習(xí)。 什么是vue vue是一個(gè)前端框架,主要兩個(gè)特點(diǎn):數(shù)據(jù)綁定、組件化。 安裝環(huán)境 根據(jù)教程安裝環(huán)境:node.js、npm、webpack、vue-cli主要的命...
摘要:組件的復(fù)用你可以將組件進(jìn)行任意次數(shù)的復(fù)用注意當(dāng)點(diǎn)擊按鈕時(shí),每個(gè)組件都會(huì)各自獨(dú)立維護(hù)它的。 1、基本示例 // 定義一個(gè)名為 button-counter 的新組件 Vue.component(button-counter, { data: function () { return { count: 0 } }, template: You cli...
摘要:哪吒別人的看法都是狗屁,你是誰(shuí)只有你自己說(shuō)了才算,這是爹教我的道理。哪吒去他個(gè)鳥(niǎo)命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰(shuí)和你做朋友太乙真人人是否能夠改變命運(yùn),我不曉得。我只曉得,不認(rèn)命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
閱讀 4146·2021-09-22 15:49
閱讀 3460·2021-09-08 09:35
閱讀 1493·2019-08-30 15:55
閱讀 2394·2019-08-30 15:44
閱讀 807·2019-08-29 16:59
閱讀 1708·2019-08-29 16:16
閱讀 591·2019-08-28 18:06
閱讀 1057·2019-08-27 10:55