建议先看看 组件基础篇
Vue.component('component-name', {'一顿操作'})
Vue.component的第一个参数就是 组件名(取名字记得语义化点)
Vue.component('aa-bb', {})
// 必须在引用这个组件时,使用aa-bb
<aa-bb></aa-bb>
Vue.component('AaBb', {})
// 引用组件,使用时,两种命名都可使用
<aa-bb></aa-bb>
<AaBb></AaBb>
// 注意:直接在DOM(即非字符串的模板)中使用时只有aa-bb是有效的
Vue.component('aa-bb', {
// 一顿操作
})
这种写法的组件都是全局注册的,即注册之后,可以用在任何新建的Vue根实例(new Vue)的模板中
Vue.component('aa-a', {});
Vue.component('aa-b', {});
Vue.component('aa-c', {});
new Vue({ el: '#app' });
// 引用时,都可以使用
<aa-a></aa-a>
<aa-b></aa-b>
<aa-c></aa-c>
// 同理,每个组件各自内部都可以相互使用 这些组件
全局注册即便后期不再使用,也依旧会出现在最终的构建结果中,造成用户无谓的下载
可以通过一个普通的JS对象来定义组件:
let ComponentA = {};
let ComponentB = {};
let ComponensC = {};
然后就可以在components选项中定义 自己想要的组件:
new Vue({
el: '#app',
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})
对于compoents对象中的每个property来说,其property名就是自定义元素的名字,其property值就是这个组件的选项对象。
注意:局部注册的组件在其子组件中不可用
两种写法让我们可以组件相互使用:
// ComponentA 在 ComponentB中可用
let ComponentA = {}
let ComponentB = {
components: {
'component-a': ComponentA
}
}
// 还有一种常用写法,通过Babel和webpack使用ES2015模块
import CA from './相应的路径';
export default {
components: {
CA // 其实是 CA: CA 的缩写,变量名同时是用在模块中自定义元素的名称、包含了这个组件选项的变量名
}
}
专门为 通过 import/require 使用一个模块系统,特殊说明和注意事项
推荐新建一个components目录,并将每个组件放置在其各自的文件中:
// 一下是组件CC的文化内部,只需要在使用前导入每个想要使用的组件
import CA from './相对应的路径';
import CB from './相对应的路径';
export default {
components: {
CA,
CB
}
}
这样组件CA和组件CB都可以在CC的模板中使用了
基础组件:只是包含一个输入框或按钮之类的元素,会被频繁使用到。
如果这时使用上面的写法,必然是一个长列表,后期维护起来不方便
// 长列表
import BaseButton from './相应的路径';
import BaseInput from './相应的路径';
import BaseIcon from './相应的路径';
import BaseButton from './相应的路径';
export default {
components: {
BaseButton,
BaseInput,
BaseIcon,
BaseButton
}
}
// 使用时只用了一小部分
<BaseInput
v-model="searchText"
@keydown.enter="search"
></BaseInput>
<BaseButton
@click="search"
<BaseIcon name="search"></BaseIcon>
></BaseButton>
可以使用webpack(或在内部使用webpack的Vue CLI 3+),就可以使用 require.context 只全局注册这些通用的基础组件:
// src/main.js 全局导入基础组件的实例代码
import Vue from 'vue';
import upperFirst from './路径';
import camelCase from './路径';
const requireComponent = require.context(
// 其组件目录的相对路径
'./组件目录路径',
// 是否查询其子目录
false,
// 匹配基础组件文件名的正则表达式
/Base[A-Z]\w+\.(vue|js)$/
)
requireComponent.keys().forEach(fileName => {
// 获取组件配置
const componentConfig = requireComponent(fileName)
// 获取组件的 PascalCase 命名
const componentName = upperFirst(
camelCase(
// 获取和目录深度无关的文件名
fileName
.split('/')
.pop()
.replace(/\.\w+$/, '')
)
)
// 全局注册组件
Vue.component(
componentName,
// 如果这个组件选项是通过 'export default'导出的
// 那么就会优先使用 '.default'
// 否则回退到使用模块的根
componentConfig.default || componentConfig
)
})
注意:全局注册的 行为必须在根Vue实例(通过new Vue)创建之前发生