首页 > 其他分享 >Vue3动态生成组件

Vue3动态生成组件

时间:2024-07-18 22:18:23浏览次数:9  
标签:index show component 生成 funConfig Vue3 组件 import

在 Vue 3 中,要遍历 funConfig 并动态生成组件,可以使用 Vue 的 defineAsyncComponent 来加载异步组件,并结合 v-for 指令在模板中进行渲染。
以下是一个示例代码来实现这个需求:

1. 配置文件

确保配置文件导出的是一个 reactive 对象:

import { reactive } from 'vue';

export const funConfig = reactive([
  {
    name: '航线规划',
    icon: 'fun-route',
    show: false,
    component: () => import('./components/RouteBox/index.vue')
  },
  {
    name: '海洋气象',
    icon: 'fun-weather',
    show: false,
    component: () => import('./components/SeaCurrent/index.vue')
  },
  {
    name: '船舶过滤',
    icon: 'fun-ship',
    show: false,
    component: () => import('./components/ShipBox/index.vue')
  },
  {
    name: '港口过滤',
    icon: 'fun-port',
    show: false,
    component: () => import('./components/PortBox/index.vue')
  },
]);

2. Vue 组件

在 Vue 组件中,使用 defineAsyncComponent 来动态加载组件,并使用 v-for 指令来遍历 funConfig

<template>
  <div>
    <div v-for="(item, index) in funConfig" :key="index">
      <button @click="toggleShow(index)">
        <span :class="item.icon"></span>
        {{ item.name }}
      </button>
      <component :is="item.show ? item.component : null"></component>
    </div>
  </div>
</template>

<script>
import { defineComponent, defineAsyncComponent } from 'vue';
import { funConfig } from './path/to/your/config/file';

export default defineComponent({
  name: 'DynamicComponentLoader',
  setup() {
    // 包装组件,防止 component 属性不是函数时报错
    funConfig.forEach(item => {
      if (typeof item.component === 'function') {
        item.component = defineAsyncComponent(item.component);
      }
    });

    const toggleShow = (index) => {
      funConfig[index].show = !funConfig[index].show;
    };

    return {
      funConfig,
      toggleShow
    };
  }
});
</script>

解释

  1. 配置文件:确保 component 属性是一个函数,它返回一个动态导入组件的 Promise。
  2. 组件模板:使用 v-for 来遍历 funConfig 数组,并使用 <component :is="..."> 动态渲染组件。
  3. 包装组件:在 setup 函数中,使用 defineAsyncComponent 包装 component 属性,确保它们都是异步组件。
  4. 显示/隐藏逻辑:使用一个简单的 toggleShow 方法来控制 show 属性,从而控制组件的显示和隐藏。

这样,就可以根据配置文件动态生成并渲染页面组件了。

标签:index,show,component,生成,funConfig,Vue3,组件,import
From: https://www.cnblogs.com/echohye/p/18310526

相关文章

  • Vue3学习---1
    Vue3学习1.初识Vue1.1HelloWorld程序<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><ti......
  • NET9 Asp.net Core将整合OpenAPI的文档生成功能而无需三方库
    OpenAPI规范是用于描述HTTPAPI的标准。该标准允许开发人员定义API的形状,这些API可以插入到客户端生成器、服务器生成器、测试工具、文档等中。尽管该标准具有普遍性和普遍性,但ASP.NETCore在框架内默认不提供对OpenAPI的支持。当前ASP.NETCore不提供对OpenAPI......
  • 深入理解 Vue 3 组件通信
    在Vue3中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的Vue3组件通信方法,包括props、emits、provide和inject、事件总线以及Vuex状态管理。1.使用props和emits进行父子组件通信props传递数据props是父组件向子组件传递......
  • 基于注解方式组件管理
    基于注解方式组件管理之前是通过在xml文件中向ioc容器中配置bean,通过<bean标签的方式,注解的方式是在Java类上使用注解标记某个类,将该类配置到ioc容器。主要分成两步:在类上使用注解让ioc识别那些类加了注解1.注解的ioc配置spring提供了以下几个注解,直接标记在类上,把他......
  • 生成订单号
    php生成订单号生成订单号可以使用以下几种实现方法:使用当前时间戳:可以使用PHP函数time()获取当前的时间戳,然后将其转换为字符串作为订单号。例如:$order_number=(string)time();使用UUID:UUID(通用唯一识别码)是一种生成全局唯一标识符的算法,可以使用PHP函数uniqid()生成UUI......
  • python gradio 的输出展示组件
    HTML:展示HTML内容,适用于富文本或网页布局。JSON:以JSON格式展示数据,便于查看结构化数据。KeyValues:以键值对形式展示数据。Label:展示文本标签,适用于简单的文本输出。Markdown:支持Markdown格式的文本展示。Plot:展示图表,如matplotlib生成的图表。Text:用于显示文本,适合较长的输出。......
  • 微信小程序开发中的第三方组件与插件使用
    微信小程序开发中,可以使用第三方组件和插件来扩展小程序的功能和性能。本文将结合代码案例,详细介绍第三方组件和插件的使用。一、第三方组件的使用引入第三方组件微信小程序开发者工具提供了「插件」功能,可以用来引入第三方组件。首先,在小程序的app.json文件中的"plugins"字......
  • 重生归来,从 996福报 到 N+1告别职场【如何封装一个支持图片和PDF在线预览的Vue组件】
    如何封装一个支持图片和PDF在线预览的Vue组件在本文中,我将介绍如何设计并实现一个Vue组件,该组件能够在线预览图片和PDF文件。我们将基于element-ui的elImageViewer组件进行改造,并使用vue-pdf插件来实现PDF预览功能。本文将详细介绍从设计思路到落地实现的全过程,完整代码在......
  • python学习之---迭代器与生成器
    什么是迭代器可迭代对象:可以通过for循环来实现遍历,例如list、string、dict迭代器:不仅可以使用for循环,还可以使用next()方法、__iter__()next():获取容器中的下一个元素,当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器iter():内建函数获取......
  • uni-app的checkbox组件有些情况下视图层不更新解决方案
    应用场景问题:在使用uniapp的复选框组件checkbox实现列表的全选跟不全选功能时发现,列表的checkbox视图层在某些情况下不生效    解决方法 解决方案1:利用  this.$set改变数据,即 this.$set(item,'checked',false),这个时候视图层跟数据都一起更新了,但是在上面那种......