vue3.0公共组件自动导入

一、前提

我们使用的是require.context方法导入,在vite创建的项目内使用会报错"require not found",所以必须用webpack创建项目。或者有大能可以说说vite怎么解决这个问题。
2021年5月17日,经过几天测试,vite2的自动导入搞定了。

二、规则

我使用的注册规则是,搜索src/components/路径下的所有目录和子目录,搜索文件名叫做"index.vue"的文件,使用上级目录的名字作为组件名,进行注册。结构如下:
在这里插入图片描述
只注册index.vue,其他名字的组件不注册,

三、webpack项目自动注册

由于vue3.0没有import “Vue” from vue,我们需要使用app来注册,所以只能在 main.js
入口文件注册

// src/main.js

import { createApp } from 'vue'
const app = createApp(App)
// 动态注册公共组件
const requireComponent = require.context(
    // 其组件目录的相对路径
    '@/components',
    // 是否查询其子目录
    true,
    // 匹配基础组件文件名的正则表达式
    /index.vue$/
)
const jieguo = requireComponent.keys().filter((item:any)=> true)
jieguo.forEach((item:any)=>{
    const componentConfig = requireComponent(item)
    const name = item.split("/")[1]
    app.component(name,componentConfig.default || componentConfig)
})
// 注册结束

app.mount('#app')

当我们新建、删除、给公共组件改名等操作,注册方面就不需要任何操作了。重启一下项目,喝口水的时间就行了 。

四、vite2项目自动注册

import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 自动导入公共组件
const modulesFiles:any = import.meta.globEager('./components/*/*.vue')
// console.log(modulesFiles,"看看是什么东西")
const jieguo = Object.keys(modulesFiles).filter((item:any)=> true)
// console.log(jieguo,"结果")
jieguo.forEach((item:any)=>{
    const moduleName = item.split("/")[2]
    const componentConfig = modulesFiles[item]
    app.component(moduleName,componentConfig.default || componentConfig)
})
// 自动导入结束
app.mount('#app')
### Vue 3.0 组件嵌套使用指南 在 Vue 3.0 中,组件的嵌套是通过父组件和子组件之间的关系实现的。父组件可以通过 `import` 引入组件,并将其注册到模板中。以下是详细的说明与示例代码。 #### 1.组件定义 首先,创建一个子组件文件,例如 `ChildComponent.vue`,并在其中定义模板、脚本以及样式部分。 ```vue <!-- ChildComponent.vue --> <template> <div class="child"> <p>这是子组件的内容</p> </div> </template> <script> export default { name: "ChildComponent", }; </script> <style scoped> .child { border: 1px solid #ccc; padding: 10px; } </style> ``` #### 2.组件引入组件 接下来,在父组件中通过 `import` 引入组件,并将其注册到 `components` 属性中。然后在模板中使用子组件标签。 ```vue <!-- ParentComponent.vue --> <template> <div class="parent"> <h1>这是父组件的内容</h1> <ChildComponent /> </div> </template> <script> // 引入组件 import ChildComponent from "./ChildComponent.vue"; export default { name: "ParentComponent", components: { ChildComponent, // 注册子组件 }, }; </script> <style scoped> .parent { margin: 20px; padding: 20px; border: 2px dashed #aaa; } </style> ``` #### 3. 使用插槽(Slot)进行内容分发 如果需要将父组件的内容传递给子组件,可以使用 Vue 的插槽机制。Vue 3.0 支持默认插槽、具名插槽和作用域插槽。 - **默认插槽**:直接将内容插入到子组件中。 - **具名插槽**:通过 `v-slot:name` 或简写 `#name` 指定插槽名称。 - **作用域插槽**:通过子组件传递数据给父组件。 以下是一个作用域插槽的示例: ```vue <!-- ChildComponent.vue --> <template> <div class="child"> <slot name="content" :data="items"></slot> </div> </template> <script> export default { data() { return { items: ["苹果", "香蕉", "橙子"], // 子组件的数据 }; }, }; </script> ``` 在父组件中使用作用域插槽: ```vue <!-- ParentComponent.vue --> <template> <div class="parent"> <ChildComponent v-slot:content="{ data }"> <div v-for="(item, index) in data" :key="index">{{ item }}</div> </ChildComponent> </div> </template> <script> import ChildComponent from "./ChildComponent.vue"; export default { components: { ChildComponent, }, }; </script> ``` #### 4. 树摇优化(Tree-Shaking) 在 Vue 3.0 中,组件支持按需导入,从而减少打包体积。如果某些功能未被使用,则不会被打包进最终的构建文件中[^3]。例如,如果项目中没有使用 `Transition` 或 `KeepAlive`,它们的代码将不会被包含在最终的构建结果中。 --- ### 注意事项 - 在 Vue 3.0 中,`setup` 是一个新的组合式 API,它优先于传统的选项式 API(如 `data`、`methods` 等)。如果存在同名属性或方法,`setup` 中的定义会覆盖选项式 API 的定义[^1]。 - 如果需要在父组件中传递数据给子组件,可以使用 `props`;如果需要子组件向父组件发送消息,可以使用 `$emit`。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值