vue获取本地文件夹中所有的图标/片,渲染页面列表

本文介绍了一种使用Node.js的方法来动态加载本地文件夹中的图片资源,并将这些资源信息存储到Vue实例的一个数组中,以便在页面创建时可以渲染出所有预定义的图标/图片列表。
 const path = require("path");
     //读取文件的路径 是否遍历文件的子目录 匹配文件正则表达式
     const files = require.context("@/assets/serve", false, /\.(png|jpg|gif|jpeg|webp|ico)$/);
     //files(key).default拿到该模块的vue对象
     files.keys().forEach(key => {
       const name = path.basename(key);
       const a = { url: require("@/assets/serve/" + name), name: name }
       this.serviceImg.push(a)
     });

在created中写入js代码,获取本地图标/片列表,渲染页面

<think>首先,用户的问题是:“我想了解如何在Vue3中将本地封装的组件代码渲染页面上请问Vue3使用本地封装组件页面显示方法”。这翻译成英文是:“IwanttoknowhowtorenderlocallyencapsulatedcomponentcodeontoapageinVue3.PleasetellmethemethodforVue3touselocalencapsulatedcomponentstodisplayonapage.”从引用中,我可以提取相关信息:-引用[1]:提到在Vue中创建组件并局部注册。-引用[2]:讨论Vue组件封装,父组件传参给子组件。-引用[3]:在Vue3中使用vite,注册SVG图标组件。-引用[4]:Vue3+TS项目封装SVG图标显示组件,使用vite-plugin-svg-icons插件。-引用[5]:vue3ant-design-vue封装上传图组件。用户的需求是渲染本地封装的组件到页面上。在Vue3中,这通常涉及创建组件文件、注册组件(全局或局部),然后在模板中使用它。关键步骤:1.**创建组件文件**:在项目中创建一个.vue文件,定义组件。例如,在src/components文件夹中创建MyComponent.vue。2.**注册组件**:-**局部注册**:在父组件的<script>中导入并使用components选项注册。-**全局注册**:在main.js或main.ts中导入并使用app.component()注册,使所有组件可用。3.**使用组件**:在模板中使用<my-component>标签来渲染。从引用中:-引用[1]:展示局部注册。-引用[3]和[4]:展示全局注册SVG图标组件。-引用[4]:具体代码示例如何全局注册SvgIcon组件。用户提到“本地封装的组件代码”,所以我应该强调创建本地文件并导入。我的回答需要:-结构清晰,逐步解释。-使用中文。-生成相关问题。-添加引用标识([^数字])在引用的段落末尾。系统级指令:-行内数学表达式用$...$,但这里可能不需要数学。-独立公式用$$...$$,但这里可能不需要。-LaTeX语法正确。-生成相关问题。回答结构:1.**介绍**:简要解释Vue3中组件渲染的基本概念。2.**步骤详解**:a.创建组件文件。b.导入组件。c.注册组件(局部或全局)。d.在模板中使用。3.**代码示例**:提供简单示例。4.**引用相关部分**:自然地引用提供的信息。5.**相关问题**:生成几个相关问题。生成相关问题:1.如何在Vue3中全局注册组件?2.Vue3中局部注册和全局注册的区别是什么?3.如何在Vue3组件中传递props?4.Vue3中使用CompositionAPI封装组件的优势?5.如何测试Vue3组件的渲染?确保回答真实可靠:基于Vue3官方文档和常见实践。最终回答大纲:-**引言**:解释组件渲染过程。-**步骤1:创建组件文件**。-**步骤2:导入组件**。-**步骤3:注册组件**(分局部和全局)。-**步骤4:在页面中使用组件**。-**完整示例**。-**相关问题**。</think>### Vue3 中使用本地封装组件渲染页面的方法 在 Vue3 中,将本地封装的组件渲染页面上是一个核心开发任务,它涉及创建组件文件、注册组件(局部或全局),并在模板中使用组件标签。Vue3 支持 Composition API 和 Options API,这里以 Composition API 为主进行说明。过程简洁可靠,确保组件代码被正确导入和渲染。以下是逐步指南,基于 Vue3 官方最佳实践。 #### 步骤 1: 创建本地组件文件 首先,在项目中创建一个.vue文件来定义组件。通常放在`src/components`目录下。文件包含`<template>`、`<script>`和`<style>`部分,定义组件的模板、逻辑和样式。 - 例如,创建一个`MyComponent.vue`文件: ```vue <!-- src/components/MyComponent.vue --> <template> <div> <h2>{{ title }}</h2> <p>这是一个本地封装的组件示例。</p> </div> </template> <script setup> // 使用 Composition API 定义组件逻辑 import { ref } from 'vue'; const title = ref('欢迎使用我的组件'); </script> <style scoped> /* 局部样式 */ div { border: 1px solid #ccc; padding: 10px; } </style> ``` 此文件封装了一个简单组件,显示标题和文本。 #### 步骤 2: 导入组件到父组件 在需要使用该组件的父组件(如页面组件)中,通过`import`语句导入本地组件文件。父组件通常位于`src/views`或`src/pages`目录。 - 例如,在`App.vue`或某个页面组件中导入: ```vue <!-- src/App.vue --> <template> <div id="app"> <MyComponent /> <!-- 这里将渲染本地组件 --> </div> </template> <script setup> // 导入本地封装的组件 import MyComponent from '@/components/MyComponent.vue'; </script> ``` 导入路径使用`@/`别名,指向项目根目录的`src`文件夹(需在构建工具如 Vite 或 Vue CLI 中配置)[^2]。 #### 步骤 3: 注册组件 Vue3 提供两种注册方式:**局部注册**(在父组件内注册)和**全局注册**(在应用入口注册)。选择哪种取决于组件的复用范围: - **局部注册(推荐)**:仅在当前父组件中可用。在父组件的`<script setup>`中直接导入即可,无需额外注册(Vue3 的`<script setup>`语法糖自动处理)。 - 如上述`App.vue`示例,导入后直接在模板使用`<MyComponent />`。 - 优点:作用域明确,避免全局污染。 - **全局注册**:在整个应用中都可用。在入口文件(如`main.js`或`main.ts`)中使用`app.component()`方法。 - 示例: ```javascript // src/main.js import { createApp } from 'vue'; import App from './App.vue'; import MyComponent from '@/components/MyComponent.vue'; // 导入本地组件 const app = createApp(App); app.component('MyComponent', MyComponent); // 全局注册 app.mount('#app'); ``` - 之后,任何组件模板中可直接使用`<MyComponent />`。 - 优点:适合高频复用组件,如 UI 库中的图标组件(参考 SVG 图标全局注册示例[^4])。 #### 步骤 4: 在页面模板中使用组件 在父组件的模板中,使用组件标签(如`<MyComponent />`)渲染组件。Vue 会自动处理组件的挂载和更新。 - **传递 Props(可选)**:如果需要动态数据,可在组件标签中添加 props。 - 在`MyComponent.vue`中定义 props: ```vue <script setup> defineProps({ title: { type: String, default: '默认标题' } }); </script> ``` - 在父组件模板中传递: ```vue <MyComponent :title="'自定义标题'" /> ``` - **渲染效果**:组件将作为 DOM 元素渲染页面中,支持响应式更新。 #### 完整示例:局部注册渲染 以下是一个端到端的示例,展示如何封装、导入和渲染组件: 1. **组件文件**:`src/components/MyHeader.vue` ```vue <template> <header> <h1>{{ headerText }}</h1> </header> </template> <script setup> defineProps({ headerText: String }); </script> ``` 2. **父组件(页面)**:`src/views/HomePage.vue` ```vue <template> <div> <MyHeader headerText="首页标题" /> <p>页面内容...</p> </div> </template> <script setup> import MyHeader from '@/components/MyHeader.vue'; // 导入并自动局部注册 </script> ``` 3. **运行结果**:启动开发服务器(如`npm run dev`),页面将显示渲染的`<MyHeader>`组件。 #### 注意事项 - **构建工具支持**:确保使用 Vite 或 Vue CLI 等工具,它们处理文件导入和热重载。例如,Vite 项目需在`vite.config.js`中配置别名(如`resolve: { alias: { '@': path.resolve(__dirname, 'src') } }`)[^3]。 - **常见问题**: - 组件未渲染?检查导入路径是否正确,或注册方式是否匹配(如全局注册后未在入口文件调用`app.mount()`)。 - 样式不生效?使用`<style scoped>`确保样式局部化。 - 参考封装实践:SVG 图标组件的全局注册展示了类似模式[^4],上传组件封装强调了逻辑分离[^5]。 通过以上步骤,您可以高效地将本地封装组件渲染Vue3 页面中,提升代码复用性和可维护性[^2]。 ### 相关问题 1. Vue3 中全局注册组件和局部注册组件有哪些性能差异? 2. 如何在 Vue3 中使用 Composition API 封装可复用的表单组件? 3. Vue3 组件间通信有哪些方法?例如父子组件如何传递事件? 4. 在 Vite 项目中,如何配置别名来简化组件导入路径? 5. Vue3 组件的单元测试应该如何进行?例如使用 Vitest 测试渲染逻辑? [^1]: Vue封装组件的过程。B3、<template>及<script>创建的组件,局部注册 var app = new Vue({ el: '#app', components: { 'my-com': { template: '#myCom' } } })。 [^2]: Vue 组件封装,父组件传参给子组件,子组件调用父组件。在 Vue 开发中,组件化是提升代码复用性和可维护性的重要手段。通过组件化,可以将常用的功能封装为独立的组件,并在需要的地方复用。 [^3]: vue3封装svg图标组件(vite)。2.在main.js引入src/libs/index并进行注册 import { createApp } from 'vue' import App from './App.vue' import router from './router' import { useREM } from './utils/flexible' import mLibs from './libs' // ===================这行1 import './styles/index.scss' // 注册 svg-icons import 'virtual:svg-icons-register' // ===================这行2(后面安装插件vite-plugin-svg-icons需要用到) useREM() createApp(App).use(router).use(mLibs).mount('#app') // =============还有这里的 use(mLibs)3。 [^4]: Vue3+TS项目封装SVG图标显示组件vite-plugin-svg-icons插件使用。在src\components目录下新建组件:SvgIcon.vue <template> <svg :style="iconStyle" aria-hidden="true"> <use :xlink:href="iconUrl" :fill="color"/> </svg> </template> <script lang="ts" setup> import { computed } from 'vue'; const props = defineProps({ name: { type: String, default: '', }, size: { type: String, default: '14', }, color: { type: String, default: '#3f99fa', }, }) const iconUrl = `#icon-${props.name}`; const iconStyle = computed(() => { return { height: `${props.size}px`, width: `${props.size}px`, }; }) </script> <style scoped> </style> main.ts中将SvgIcon注册为全局组件 import 'virtual:svg-icons-register'; import SvgIcon from "@/components/SvgIcon.vue"; const app = createApp(App) app.component("SvgIcon", SvgIcon); 页面中使用SvgIcon // template中 <SvgIcon name="ic_money" size="20" color="#fbd95d"></SvgIcon> // js中 导入组件 import SvgIcon from '@/components/SvgIcon.vue'。 [^5]: vue3 ant-design-vue 封装上传图组件。定义:axios的进度条参数,可以在函数使用时,自定义进度条;可以监控整个文件上传的进度过程。直接返回百分比,值在0-1之间。 let formData = new FormData(); const uploadFile = ref([]) //上传的文件 formData.append("file", file.originFileObj); //post上传 Http.post('/xxx/xxx/Upload', formData, { onUploadProgress: e => { if (e.upload) { //监控文件的上传进度 uploadFile.value[i]['percent'] = e.progress.toFixed(2) * 100 } } }).then(data => { if (data.Success) { //返回上传的值 data,可以将data中的数据返回给指定的字段 } else { message.error(`${data.Message}`) } })。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值