vue全局注册组件

随心记之 webpack自动注册全局组件
  

// 是否包含 '-'
function isContains(str, character = '-') {
    return str.indexOf(character) != -1
}
// 首字符转大写
function firstToUpper(str) {
    str = str.trim()
    let fitstText = str[0].toUpperCase()
    return str.replace(str[0], fitstText)
}
// 转驼峰写法
function toHump(componentName) {
    let temp = componentName.split('-')
    temp = temp.map((str) => {
        return firstToUpper(str)
    });
    return temp.join('')
}

// 读取compoents 文件夹下所有的 .vue文件
const requireComponent = require.context('@/components', true,/.vue$/)
// get all compoent list
let compoents = requireComponent.keys()

export default {
    install(Vue) {
        try{
            compoents.forEach(filename => {
                //获取组件配置
                const componentConfig = requireComponent(filename);
                // 组件配置中是否配置了name
                let componentName = (componentConfig.default || componentConfig).name
                // 未配置name选项 根据文件名生成名称
                if (!componentName) {
                    // 截取最后面的名字    
                    componentName = filename.split('/')[filename.split('/').length - 1]
                    componentName = componentName.replace(/.vue$/, '')
                    // 包含 -  转成驼峰
                    if (isContains(componentName)) {
                        componentName = toHump(componentName)
                    }
                } else if (isContains(componentName)) {
                    componentName = toHump(componentName)
                }
                // console.log(componentName)
                //全局注册组件
                Vue.component(componentName, componentConfig.default || componentConfig)
            })
        }catch(err){
            console.log('注册全局组件出错')
        }
    }
}
posted @ 2020-07-07 17:37  因一人念一城  阅读(277)  评论(0编辑  收藏  举报