vue 如何更好的注册全局组件

vue 如何更好的注册全局组件

    • 通常做法
    • [install + use 批量注册](#install + use 批量注册)
    • [Vue3 注册全局组件](#Vue3 注册全局组件)
    • 参考

通常做法

把组件导出到 main.js,然后 Vue.component(id,component),一个个注册,缺点:效率不高

改进:把需要全局注册的组件放在数组中导出,然后 forEach 注册。

js 复制代码
import globalComponents from './components'
globalComponents.forEach(component => {
	Vue.component(component.name, component)
})

install + use 批量注册

在 components 的 index.js

js 复制代码
import ZmTable from './table'
const components = [ZmTable]
const allGlobalComponents = {
  install(Vue) {
    try {
      components.forEach(component => {
        if (!component.name) {
          // 跳出 forEach 的技巧
          throw new Error('组件必须提供名字,并且使用大驼峰式命名')
        } else {
          Vue.component(component.name, component)
        }
      })
    } catch (error) {
      console.error(error)
    }
  }
}

export default allGlobalComponents

main.js 中

js 复制代码
import allGlobalComponents from './components'
Vue.use(allGlobalComponents)

Vue3 注册全局组件

在 components 目录的 index.ts 编写注册函数

ts 复制代码
import Add from './Add.vue'
import HelloWorld from './HelloWorld.vue'

// 创建一个类型
import { createApp, defineComponent } from 'vue'
const app = createApp(defineComponent({}))
type App = typeof app //NOTE  声明一个类型

export const components = [Add, HelloWorld]
export const registerComponents = (app: App) => {
  components.forEach(component => {
    // @ts-ignore
    app.component(component.name, component)
  })
}

在 main.ts 中注册:

js 复制代码
import { components } from './components'
// NOTE 注册全局组件,必须在根组件挂载之前
components.forEach(component => {
  // @ts-ignore
  app.component(component.name, component)
})
app.mount('#app')

以插件形式注册:

components index.js

js 复制代码
import MyModel from './MyModel.vue'
const components = [MyModel]
export const registerComponents = app => {
  components.forEach(component => {
    app.component(component.name, component)
  })
}

main.js

js 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { registerComponents } from './components'
const vue = createApp(App)
vue.use(registerComponents, app)
// registerComponents(vue) // 还可以这样

通过 install 注册组件:

js 复制代码
import MyModel from './MyModel.vue'
const components = [MyModel]
export const registerComponents = {
  install(app) {
    components.forEach(component => {
      app.component(component.name, component)
    })
  }
}

main.js:

js 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import { registerComponents } from './components'
const vue = createApp(App)
vue.use(registerComponents, app)
// registerComponents(vue) //NOTE 不能这样注册

参考

vue官网 - 编写插件

相关推荐
PedroQue9910 小时前
0.8.2 新增 backFallback 配置,无 tabbar 页返回无忧
前端·uni-app
淡漠的蓝精灵10 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
开开心心就好10 小时前
竖式除法出题工具,整除余数混合模式
运维·服务器·前端·javascript·ocr·perl·1024程序员节
起个名字费劲死了10 小时前
Halcon学习一:骰子识别
前端·python·学习
大江东去浪淘尽千古风流人物10 小时前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
এ慕ོ冬℘゜10 小时前
JS 事件循环、宏任务微任务:单线程底层原理 + 执行顺序
开发语言·javascript·ecmascript
其实防守也摸鱼11 小时前
Chrome 扩展安全攻防实录:从攻击面到防御实践
开发语言·前端·网络·chrome·安全·web安全·php
web打印社区11 小时前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
李剑一11 小时前
为什么几乎所有的知名开源项目都是外国人写的?
前端·ai编程·deepseek
小郎君65811 小时前
(一)为什么表单需要第三种状态:disabled、readonly 与纯文本展示
前端·vue.js