详解Vue3中如何使用动态组件

在 Vue 3 中,动态组件是一种允许在运行时动态切换组件的机制,本文主要为大家详细介绍了动态组件在Vue3中的具体使用。

Vue 3 提供了 元素以及 is 特性来实现动态组件的切换。

一、使用元素

在模板中使用 元素,通过 is 特性来动态切换组件:

javascript 复制代码
<template>
  <div>
    <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
      <el-tab-pane label="待审核" name="1" />
      <el-tab-pane label="已通过" name="2" />
      <el-tab-pane label="未通过" name="3" />
      <el-tab-pane label="黑名单" name="4" />
    </el-tabs>
    <component
      ref="componentRef"
      :is="componentName"
      :activeName="activeName"
    ></component>
  </div>
</template>
<script setup>
import { ref, toRefs, computed, markRaw, nextTick } from "vue";
// 待提交
import PendingReview from "./pendingReview.vue";
// 已通过
import Passed from "./passed.vue";
// 未通过
import NotPass from "./notPass.vue";
// 黑名单
import Blacklist from "./blacklist.vue";

const componentRef = ref();


const activeName = ref("1");
const componentName = ref(markRaw(PendingReview));

const handleClick = (tab) => {
  if (tab.paneName === "1") {
    componentName.value = markRaw(PendingReview);
  } else if (tab.paneName === "2") {
    componentName.value = markRaw(Passed);
  } else if (tab.paneName === "3") {
    componentName.value = markRaw(NotPass);
  } else {
    componentName.value = markRaw(Blacklist);
  }
};
</script>
<style></style>

二、使用 v-if 或 v-show

除了 元素,你也可以使用 v-if 或 v-show 来动态渲染组件:

javascript 复制代码
<template>
  <div>
    <el-tabs type="card" v-model="activeName">
      <el-tab-pane label="待审核" name="1" />
      <el-tab-pane label="已通过" name="2" />
      <el-tab-pane label="未通过" name="3" />
      <el-tab-pane label="黑名单" name="4" />
    </el-tabs>
    <PendingReview v-if="activeName == '1'"/>
    <Passed v-if="activeName == '2'"/>
    <NotPass v-if="activeName == '3'"/>
    <Blacklist v-if="activeName == '4'"/>
  </div>
</template>
<script setup>
import { ref, toRefs, computed, markRaw, nextTick } from "vue";
// 待提交
import PendingReview from "./pendingReview.vue";
// 已通过
import Passed from "./passed.vue";
// 未通过
import NotPass from "./notPass.vue";
// 黑名单
import Blacklist from "./blacklist.vue";

const componentRef = ref();

const props = defineProps({
  callData: {},
});
const activeName = ref("1");

</script>
<style></style>
相关推荐
ai小鬼头9 分钟前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
wen's17 分钟前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js
一只叫煤球的猫1 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
vvilkim1 小时前
Electron 自动更新机制详解:实现无缝应用升级
前端·javascript·electron
vvilkim1 小时前
Electron 应用中的内容安全策略 (CSP) 全面指南
前端·javascript·electron
aha-凯心1 小时前
vben 之 axios 封装
前端·javascript·学习
漫谈网络1 小时前
WebSocket 在前后端的完整使用流程
javascript·python·websocket
遗憾随她而去.1 小时前
uniapp 中使用路由导航守卫,进行登录鉴权
前端·uni-app
xjt_09012 小时前
浅析Web存储系统
前端
foxhuli2292 小时前
禁止ifrmare标签上的文件,实现自动下载功能,并且隐藏工具栏
前端