文件结构

vue组件注册 - 图1

  1. -src
  2. -- ...
  3. --components
  4. --my-button
  5. --src
  6. --index.vue 组件代码
  7. --style
  8. --style.css 组件样式如果过多,可以单独件放在文件中,在组件中引入
  9. --my-input
  10. --src
  11. --index.vue
  12. --style
  13. --style.css
  14. --index.js //多组件注册时,在这里统一添加install方法

vue2

全局注册

Vue.component

  • 统一处理组件 ```javascript // src/components/index.js // 引入封装好的组件 import MyButton from ‘./my-button/src/index.vue’ import MyInput from ‘./my-input/src/index.vue’

// 将来如果有其它组件,都可以写到这个数组里 const components = [ MyButton, MyInput ] // 导出组件 export default components

  1. - 注册组件
  2. ```javascript
  3. // src/main.js
  4. import { createApp } from 'vue'
  5. import App from './App.vue'
  6. // 导入统一处理的组件
  7. import components from './components/index'
  8. const app = createApp(App)
  9. // Vue.component批量注册全局组件
  10. components.map(component => {
  11. app.component(component.name, component)
  12. })
  13. app.mount('#app')

以插件的形式注册

  • 组件添加install方法
  • 组件注册为全局组件,用到了Vue.component()方法,当使用Vue.use()时,install方法便会执行 ```javascript // src/components/index.js // 引入封装好的组件 import MyButton from ‘./my-button/src/index.vue’ import MyInput from ‘./my-input/src/index.vue’

// 将来如果有其它组件,都可以写到这个数组里 const components = [ MyButton, MyInput ]

// 批量组件注册 const install = function (vue) { components.map(component => { vue.component(component.name, component) }) } // 这个方法以后再使用的时候可以被use调用 export default { install }

  1. - 全局注册
  2. ```javascript
  3. // src/main.js
  4. import { createApp } from 'vue'
  5. import App from './App.vue'
  6. import MyUi from './components/index'
  7. const app = createApp(App)
  8. app.use(MyUi)
  9. app.mount('#app')

局部注册

  1. <template>
  2. <div id="app">
  3. <!-- 3.应用自定义组件 -->
  4. <my-button></my-button>
  5. </div>
  6. </template>
  7. <script>
  8. // 1.导入组件
  9. import MyButton from '../my-button/src/index.vue'
  10. export default {
  11. name: "App",
  12. components: {
  13. // 2.注册局部组件
  14. MyButton,
  15. },
  16. };
  17. </script>
  18. <style>
  19. </style>

vue3

全局注册

  • 手动注册组件
    • 和vue2注册全局组件相同
  • 批量注册全局组件 ```javascript / require.context() 是webpack提供的一个自动导入的API vite项目中使用import.meta.globEager/import.meta.glob 参数1:加载的文件目录 参数2:是否加载子目录 参数3:正则,匹配文件 /

//keys() 获取读取到的所有文件列表 const importFn = require.context(‘./‘, false,/.vue$/) export default { install(app) { importFn.keys().forEach(key => { // 导入组件 const component = importFn(key).default // 注册组件 app.component(component.name, component) }) } }

//导入main.js import UI(自定义) from ‘./你写的路径’ createApp(App).use(store).use(router).use(UI).mount(‘#app’)

  1. ```javascript
  2. import { defineAsyncComponent } from 'vue'
  3. const components = import.meta.glob('./*/src/*.vue')
  4. console.log(components);
  5. export default function install (app) {
  6. for (const [key, value] of Object.entries(components)) {
  7. // 因为我设计的是组件名称就是目录名称,所以这里这样取,也可以根据vue的文件名称,看个人喜好
  8. const name = key.split('/')[1]
  9. // 这里的main是我的layout,不需要注册为公共组件
  10. if (name !== 'main') {
  11. app.component(name, defineAsyncComponent(value))
  12. }
  13. }
  14. }
  15. //main.js
  16. import { createApp } from 'vue'
  17. import App from './App.vue'
  18. import components from './components/index'
  19. const app = createApp(App)
  20. app.use(components)
  21. app.mount('#app')

局部注册

  • 在单文件组件中使用了<script setup>,导入的组件会自动进行局部注册 ```javascript

  1. - 如果不使用`<script setup>`,你需要使用`components`选项
  2. ```javascript
  3. import ComponentA from './ComponentA.js'
  4. export default {
  5. components: {
  6. ComponentA
  7. },
  8. setup() {
  9. // ...
  10. }
  11. }