方法 一,
此案例以按钮为demo(由来: elementUI中的按钮点击事件中嵌套messageBox 消息弹框时,点击键盘enter键自动触发弹框,容易误操作 )
src 目录下创建components 文件夹 components里面创建 install.js和 组件目录
install.js里面
// 组件全局注册 import Vue from 'vue' import edpBtn from '@/components/edpBtn/edpBtn.vue'//封装共用组件方法一 //import AppToolbar from './AppToolbar' // 组件库 const Components = [ edpBtn //AppToolbar, ] // 注册全局组件 Components.map((com) => { Vue.component(com.name, com) }) export default Vue
edpBtn.vue edp 公司简称
<template> <div :class="[type,size]" class="default" :style="disabled||loading?'opacity: 0.5; cursor:not-allowed':'opacity: 1;cursor:pointer'" @click="btnClick"> <i v-if="loading" class="el-icon-loading"></i> <slot></slot> </div> </template> <script> export default { name: "edpBtn", props: { type: { type: String, default: "Default" }, size: { type: String, default: "Default" }, disabled: { type: Boolean, default: false }, loading: { type: Boolean, default: false } }, data() { return {}; }, computed: {}, watch: {}, methods: { btnClick() { if(!this.disabled && !this.loading){ this.$emit('click') } } } }; </script> <style lang="less"> .default { display: inline-block; line-height: 1; white-space: nowrap; cursor: pointer; background: #fff; border: 1px solid #dcdfe6; border-color: #dcdfe6; color: #606266; -webkit-appearance: none; text-align: center; box-sizing: border-box; outline: none; margin: 0; transition: .1s; font-weight: 500; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; padding: 12px 20px; font-size: 14px; border-radius: 4px; } .primary { color: #fff; background-color: #409eff; border-color: #409eff; } .success { color: #fff; background-color: #67c23a; border-color: #67c23a; } .info { color: #fff; background-color: #909399; border-color: #909399; } .warning { color: #fff; background-color: #e6a23c; border-color: #e6a23c; } .danger { color: #fff; background-color: #f56c6c; border-color: #f56c6c; } .text { border-color: transparent; color: #409eff; background: transparent; padding-left: 0; padding-right: 0; } .default.medium { padding: 10px 20px; font-size: 14px; border-radius: 4px; } .default.small { padding: 9px 15px; font-size: 12px; border-radius: 3px; } .default.mini { padding: 7px 15px; font-size: 12px; border-radius: 3px; fa}</style>
main.js 中添加 import './components/install'
方法2
- 通常在组件使用前,需要引入后再注册,但如果高频组件多了后,每次都这样做,不仅新增很多代码,效率还低!我们应该如何优化呢?
可以借助一下webpack的require.context() 方法来创建自己的(模块)上下文,从而实现自动动态require组件
先在components文件夹(这里面都是些高频组件)添加一个叫global.js的文件,在这个文件里使用require.context 动态将需要的高频组件统统打包进来,然后在main.js文件中引入global.js的文件.这样就无需再手动一个个引入了。
// globalComponents.js文件 import Vue from 'vue' function changeStr(str) {//首字符转大写 return str.charAt(0).toUpperCase() + str.slice(1) } /* * require.context(path,sta,name) * path:其组件目录的相对路径 * sta: 是否查询其子目录 * name:匹配基础组件文件名的正则表达式 /w.(vue|js)/ */ const requireComponent = require.context('./', false, /.vue$/) // 查找同级目录下以vue结尾的组件 对应每个匹true配的文件名 const install = () => { requireComponent.keys().forEach(fileName => { let config = requireComponent(fileName); //获取组件配置 // console.log(config) // ./child1.vue 然后用正则拿到child1 let componentName = changeStr( //获取组件名 fileName.replace(/^.//, '').replace(/.w+$/, '') ) // 如果这个组件选项是通过 `export default` 导出的, // 那么就会优先使用 `.default`, // 否则回退到使用模块的根。 Vue.component(componentName, config.default || config) }) } export default { install // 对外暴露install方法 } // main.js文件 import globalComponents from './plugins/globalComponents.js Vue.use(globalComponents) // page.vue 页面引用文件 <search-comp @onSearch="handleOnSearch" :conditionsData="conditionsData"></search-comp> // 注意:组件中的name要跟文件名称一致