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官网 - 编写插件

相关推荐
程序员Sunday7 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
Setsuna_F_Seiei8 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
志尊宝8 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
zhangzeyuaaa8 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙9 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯9 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
思无邪6610 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
一个风轻云淡10 小时前
GCC 和 GDB命令简单解读
java·linux·前端
u01110267511 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
福兮说11 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic