vite+vue3展示文件夹内的所有组件

https://www.cnblogs.com/y-shmily/p/16546743.html

 

在组件目录下新建index.js

复制代码
import { markRaw } from "vue";
const filesNameList = [];
const files = import.meta.glob("./*.vue");

for (const key in files) {
  const fileName = key.replace(/(\.\/|\.vue)/g, "");
  filesNameList.push(fileName);
}
// 导出当前目录下的所有.vue的文件
export default markRaw(filesNameList);
复制代码

展示所有组件 index.vue

复制代码
<template>
  <div class="drag-box">
    <div class="head">
      <h3>组件列表</h3>
    </div>
    <div class="compList">
      <!-- 渲染所有组件 -->
      <el-card
        class="items"
        shadow="hover"
        v-for="element in componentList"
        :key="element.FileName"
      >
        <div class="title"><b>组件名: </b>{{ element.FileName }}</div>
        <div class="compMian">
          <component :is="element.component"></component>
        </div>
      </el-card>
    </div>
  </div>
</template>

<script setup>
import { ref, defineAsyncComponent, markRaw } from "vue";
// 引入modules目录下所有的模板名称数组
import allComps from "./modules";
const componentList = ref([]);
allComps.map((v) => {
  let item = {
    FileName: "",
    component: null,
  };
  item.FileName = v;
  // 导入组件
  item.component = markRaw(
    defineAsyncComponent(() => import(`./modules/${v}.vue`))
  );
  // 组件列表追加组件信息
  componentList.value.push(item);
});
</script>

<style lang="less" scoped>
.drag-box .items {
  width: 100%;
  margin: 20px 0;
  border-bottom: solid 1px #999;
  // background-color: #eee;
  .title {
    font-size: 18px;
    line-height: 1.5;
    margin-bottom: 25px;
    border-bottom: solid 1px #eee;
    b {
      font-size: 22px;
    }
  }
  .compMian {
    background-color: #fff;
  }
}
</style>
复制代码

目录结构

import { markRaw } from "vue";
const filesNameList = [];
const files = import.meta.glob("./*.vue");

for (const key in files) {
  const fileName = key.replace(/(\.\/|\.vue)/g, "");
  filesNameList.push(fileName);
}
// 导出当前目录下的所有.vue的文件
export default markRaw(filesNameList);
posted @ 2024-06-13 14:46  China Soft  阅读(67)  评论(0编辑  收藏  举报