vue中 一劳永逸的组件注册,无需再import!

首先我们在vue的使用中,免不了会自己自定义组件,那么我们每次定义好组件都会先import 进来,然后在components里面引入才能用
复现以下场景

import BaseButton from './baseButton'
import BaseIcon from './baseIcon'
import BaseInput from './baseInput'

export default {
  components: {
    BaseButton,
    BaseIcon,
    BaseInput
  }
}
<BaseInput
  v-model="searchText"
  @keydown.enter="search"
/>
<BaseButton @click="search">
  <BaseIcon name="search"/>
</BaseButton>

我们平时是不是都是这么写?个人觉得太麻烦了,秉持着能偷懒就偷懒的原则,咱就配置一次,再也不用import引入就直接能用多好啊,好消息,好消息!是可以实现的:

我们需要借助一下神器webpack,使用 require.context() 方法来创建自己的(模块)上下文,从而实现自动动态require组件。这个方法需要3个参数:要搜索的文件夹目录,是否还应该搜索它的子目录,以及一个匹配文件的正则表达式。
我们在components文件夹添加一个叫global.js的文件,在这个文件里借助webpack动态将需要的基础组件统统打包进来。
当然了要根据不同的目录结构进行不同的处理
如果你是这样的目录结构

在这里插入图片描述
那么 global.js 就可以这么写

import Vue from 'vue'

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1)
}

const requireComponent = require.context(
  '.', false, /\.vue$/
   //找到components文件夹下以.vue命名的文件
)

requireComponent.keys().forEach(fileName => {
  const componentConfig = requireComponent(fileName)

  const componentName = capitalizeFirstLetter(
    fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')
    //因为得到的filename格式是: './dataList.vue', 所以这里我们去掉头和尾,只保留真正的文件名
  )

  Vue.component(componentName, componentConfig.default || componentConfig)
})

如果你是以上的目录结构,以上代码就可以满足你了

但是我不是这样的目录结构,我喜欢一个组件放在一个文件夹里,而且js和scss都分开来写,就像这样:
在这里插入图片描述

这样的话,就需要改动一下以上的代码,废话不都说,上代码

import Vue from 'vue';

function capitalizeFirstLetter(string){
    return string.charAt(0).toUpperCase() + string.slice(1);
}
const requireComponent = require.context(
    '.',true,/\.vue$/
    //找到components文件夹下以.vue命名的文件
)
requireComponent.keys().forEach(fileName => {
    const componetConfig = requireComponent(fileName);
    let a = fileName.lastIndexOf('/');
    fileName = '.' + fileName.slice(a);
    const componetName = capitalizeFirstLetter(
        fileName.replace(/^\.\//,'').replace(/\.\w+$/,'')
    )
    Vue.component(componetName,componetConfig.default || componetConfig)
})

总之,global.js建好以后,最后我们在main.js中import ‘./components/global.js’,然后我们就可以随时随地使用这些基础组件,无需手动引入了。
在这里插入图片描述
然后我们看下效果
首先我说好了,js并没有任何import,也没有components选项,直接在vue文件中使用组件

在这里插入图片描述

最后效果在这里
在这里插入图片描述

这个整体就是那个dataList组件,不需要引入就可以使用,简直太爽了!快去试试吧!

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue 3 ,可以使用 `import()` 函数动态加载子组件,然后通过 `defineAsyncComponent` 函数定义异步组件,最后在父组件动态引用该异步组件并将其添加到父组件。具体实现可以参考以下代码示例: ```vue <template> <div ref="container"></div> </template> <script> import { defineAsyncComponent } from 'vue'; export default { mounted() { this.loadChildComponent(); }, methods: { async loadChildComponent() { const ChildComponent = await import('./ChildComponent.vue'); const asyncComponent = defineAsyncComponent(ChildComponent); this.$refs.container.appendChild(asyncComponent); } } } </script> ``` 在上述代码,我们在组件的 `template` 定义了一个 `div`,并使用 `ref` 指令给它命名为 `container`。然后在组件的 `mounted` 生命周期钩子调用 `loadChildComponent` 方法。该方法使用 `import()` 函数动态加载子组件 `ChildComponent.vue`,然后使用 `defineAsyncComponent` 函数定义异步组件 `asyncComponent`。最后,我们将 `asyncComponent` 添加到 `container` ,以动态将子组件添加到父组件。 需要注意的是,`defineAsyncComponent` 函数需要接收一个返回 `Promise` 对象的函数作为参数,该函数会在组件被实例化时调用,返回一个 `Promise` 对象,表示异步组件的定义。因此,在上述代码,我们将使用 `import()` 函数动态加载子组件,并将其返回的 `Promise` 对象作为参数传递给 `defineAsyncComponent` 函数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值