详解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>
相关推荐
早點睡39013 分钟前
ReactNative项目OpenHarmony三方库集成实战:react-native-dropdown-picker
javascript·react native·react.js
升鲜宝供应链及收银系统源代码服务7 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
i建模7 小时前
将Edge浏览器的标签页从顶部水平排列**移至左侧垂直侧边栏
前端·edge
跟着珅聪学java8 小时前
js编写中文转unicode 教程
前端·javascript·数据库
英俊潇洒美少年8 小时前
Vue3 深入响应式系统
前端·javascript·vue.js
颜酱8 小时前
回溯算法实战练习(3)
javascript·后端·算法
英俊潇洒美少年9 小时前
React 最核心 3 大底层原理:Fiber + Diff + 事件系统
前端·react.js·前端框架
我命由我123459 小时前
React Router 6 - 概述、基础路由、重定向、NavLink、路由表
前端·javascript·react.js·前端框架·ecmascript·html5·js
LJianK19 小时前
java封装
java·前端·数据库
yaaakaaang9 小时前
(四)前端,如此简单!---Promise
前端·javascript