vue3 tab切换 动态组件

news2024/11/18 8:48:08

vue3 tab切换 动态组件

先看一张图
在这里插入图片描述

具体代码:

组件实例信息

如果你把组件实例放到Reactive Vue会给你一个警告:Component which was made a reactive object. This can lead to unnecessary performance overhead, and should be avoided by marking the component with markRaw or using shallowRef instead of ref.
Vue 收到一个组件,它被做成一个反应性对象。这可能会导致不必要的性能开销,应通过使用“markRaw”标记组件或使用“shallowRef”而不是“ref”来避免。

index.vue

<template>
  <a-layout class="layout">
    <a-layout-content class="main-container">
      <div class="data-bar" :class="{ collapsed: collapsed }">
        <div class="data-bar-container">
          <div class="data-bar-icon-box">
            <img :src="logo" @click="handleBackDashboard" />
          </div>
          <div class="data-bar-button" @click="handleBack">
            <LeftOutlined />
            返回上一页
          </div>

        </div>
      </div>
      <a-affix offset-top="0">
        <div class="tab-bar">
   
          <div class="tabs">
            <template v-for="(tab, tabIndex) in tabs" :key="tabIndex">
              <div
                v-if="tab.show"
                :class="'tab' + `${activeTab === tabIndex ? ' tab-active' : ''}`"
                @click="handleSwitchTab(tabIndex)"
              >
                {{ tab.title }}
              </div>
            </template>
          </div>
        </div>
      </a-affix>

      <div class="result-panel">
        <menu-unfold-outlined
          v-if="collapsed"
          class="trigger"
          @click="() => (collapsed = !collapsed)"
        />
        <menu-fold-outlined v-else class="trigger" @click="() => (collapsed = !collapsed)" />
        <a-button size="small" type="danger" class="report-btn" @click="handleReport"
          >结果报告</a-button
        >
        <component :is="comId" :baseData="baseData" :collapsed="collapsed"></component>
      </div>
    </a-layout-content>
  </a-layout>
</template>

<script lang="ts" setup>
import { markRaw, shallowRef, watch, onMounted, reactive, ref } from 'vue';
import { LeftOutlined, MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
import { useRouter } from 'vue-router';
import logo from '/@/assets/icons/logo.svg';


import { useBarcode } from './hooks/useBarcode';
import { useTabs } from './hooks/useTabs';
import * as PhyloTreeApi from '/@/serve/api/phyloTree';

const router = useRouter();
const query = JSON.parse(JSON.stringify(router.currentRoute.value.query));
for (let key in query) Object.assign(query, { [key]: String(query[key]) });

const { taskId, barcodeId, sampleId, generation, barcodeName, primerList } = query;

const baseData = reactive({
  barcodeId,
  taskId,
  sampleId,
  barcodeName,
  primerList: primerList.split(','),
  generation,
});

const { activeTab, tabs, comId, handleSwitchTab } = useTabs(generation);

const { barcodeConfig } = useBarcode(baseData);

const collapsed = ref(true);

const handleBack = () => {
  router.go(-1);
};



const handleReport = () => {
  router.push(
    `/hiv/report?taskId=${taskId}&sampleId=${sampleId}&barcodeId=${barcodeId}&generation=${generation}&barcodeName=${barcodeName}`,
  );
};



const handleBackDashboard = () => {
  router.push('/dashboard');
};


</script>

<style lang="less" scoped>
@import '/@/assets/styles/views/result2.less';
</style>

useTabs.ts

import { reactive, ref, markRaw, shallowRef } from 'vue';

import NanoStats from '../../nanoStats/index.vue';
import HtvHtml from '../../htvHtml/index.vue';
import ResultAnalyse from '../../resultAnalyse/index.vue';
import ResultTable from '../../resultTable/index.vue';
import SeqOverview from '../../seqOverview/index.vue';
import Medaka from '../../medaka/index.vue';
import MinTree from '../../minTree/index.vue';
import EvolveTree from '../../evolveTree/index.vue';

export const useTabs = (generation: string) => {
  const tabs: Array<{ title: string; show: boolean; com: any }> = reactive([
    {
      title: '数据统计',
      show: generation == '5' ? true : false,
      com: markRaw(NanoStats),
    },
    {
      title: '分子溯源',
      show: generation == '6' ? true : false,
      com: markRaw(HtvHtml),
    },
    {
      title: '准种结果分析',
      show: generation == '5' ? true : false,
      com: markRaw(ResultAnalyse),
    },
    {
      title: '原始聚类结果表',
      show: generation == '5' ? true : false,
      com: markRaw(ResultTable),
    },
    {
      title: '多序列比对结果',
      show: generation == '5' ? true : false,
      com: markRaw(SeqOverview),
    },
    {
      title: '准种序列文本',
      show: generation == '5' ? true : false,
      com: markRaw(Medaka),
    },
    {
      title: '最小生成树',
      show: generation == '5' ? true : false,
      com: markRaw(MinTree),
    },
    {
      title: '进化树',
      show: generation == '5' ? true : false,
      com: markRaw(EvolveTree),
    },
  ]);

  const activeTab = ref(0);
  const comId = shallowRef(NanoStats);

  if (generation == '5') {
    activeTab.value = 0;
    comId.value = NanoStats;
  } else if (generation == '6') {
    activeTab.value = 1;
    comId.value = HtvHtml;
  }

  const handleSwitchTab = (tabIndex: number) => {
    comId.value = tabs[tabIndex].com;
    activeTab.value = tabIndex;
    document.body.scrollTop = document.documentElement.scrollTop = 0;
  };

  return {
    activeTab,
    comId,
    tabs,
    handleSwitchTab,
  };
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetCode 1080.根到叶路径上的不足节点 + 递归

给你二叉树的根节点 root 和一个整数 limit &#xff0c;请你同时删除树中所有 不足节点 &#xff0c;并返回最终二叉树的根节点。假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff0c;则该节点被称之为 不足节点 &#xff0c;需要被删除…

【教学类-06-07】20231124 (55格版)X-Y之间“加法+题” (以10-20之间为例)(正序+逆序,题目多)

作品展示 上下两套题目不一样 背景需求 在大四班里&#xff0c;预测试55格“5以内、10以内、20以内的加法题、减法题、加减混合题”的“实用性”。 现场发现&#xff0c;只打印一份20以内加法减法混合题。 “这套20以内的加减法最难&#xff0c;谁会做&#xff1f;”&#x…

Linux基本指令及周边(第二弹)

文章目录 前言echo命令重定向more命令less指令&#xff08;重要&#xff09;head指令tail指令时间相关的指令Cal指令find指令&#xff1a;&#xff08;非常重要&#xff09; -namegrep指令.zip/unzip指令&#xff1a;tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包…

国标交流充电桩接口和直流充电桩接口介绍

1、背景 与传统油车相比&#xff0c;纯电车有太多的优势&#xff0c;但是纯电需要考虑充电时间的长短以及电池的使用寿命。然而相比较而言&#xff0c;混动有好多的备选方案比如插电式、增程式等&#xff0c;除了满足比电车较远的续航外&#xff0c;充电等待时间大大缩短。 在…

浅谈dll劫持免杀

文章目录 前置知识dll加载dll寻找DLL劫持-白加黑-导入加载DLL劫持-白加黑-导出编译DLL劫持-白加黑-图片分离hookdll原理win api核心代码注意事项 前置知识 基础技能 c语言基本知识win32 API 知识会在微软官网查询APIPE结构知识 原理 DLL劫持的原理主要就是windows下加载DLL…

柯桥学历提升培训,考研党要不要关闭朋友圈

关掉朋友圈的好处 在众多上岸人的考研经验贴中&#xff0c;可以看到&#xff0c;“适时关闭朋友圈”成为常见内容。 学长学姐给的建议都是不要通过朋友圈去过度关注别人的光鲜生活&#xff0c;也不必一定要向外展示自己的现状&#xff0c;喜怒哀乐自我消化&#xff0c;保持思想…

设置标题绑定目录

格式要求 正文标题 1标题 2标题 3款标题绑定多级标题目录页眉页脚 正文 宋体、小四、段前段后各设为 0.5 行&#xff0c;左边空两格、样式&#xff1a; XXX 左边不留空格什么意思呢&#xff1f;以下是有空格和没有空格的区别&#xff1a; 修改下正文的格式。先看下模板格式要…

报错0x0000007b问题解决

DirectX_Repair(Enhanced_Edition)工具可以解决win7 win8 win10缺少的vc库和系统库的依赖问题 链接&#xff1a;https://pan.baidu.com/s/1Bl_DtYNdaHEXYJJEb597tA 提取码&#xff1a;7p1y 有问题&#xff0c;请大家多多评论

二分查找之红蓝二分查找

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Executors(线程池操作类)

一&#xff0c;常用方法 二&#xff0c;案例 package XianChengChildren;import java.util.concurrent.*;public class ThewadPoolTest1 {public static void main(String[] args) throws Exception { // ExecutorService pool new ThreadPoolExecutor(3,5,8, // …

中国开源年度报告.问卷篇第二轮抽奖来袭!

中国开源年度报告.问卷篇第二轮抽奖来袭&#xff01;填问卷&#xff0c;赢鼠标垫&#xff0c;共建未来&#xff01; 中国开源年度报告由开源社发起&#xff0c;旨在多维度、多方式、多协作地呈现国内开源的发展情况。今年&#xff0c;我们再次邀请您一同参与&#xff0c;成为这…

人工智能时代的内容写作

内容不再只是王道&#xff0c;正如俗话所说&#xff1a;它是一种流动的货币&#xff0c;推动了巨大的在线信息和影响力经济。 每个品牌都是一个故事&#xff0c;通过其服务和商品讲述自己。尽管如此&#xff0c;大多数客户还是会通过您的在线内容最了解您。 但随着我们进入人…

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能&#xff0c;就像大数据领域里有离线计算和实时计算&#xff0c; ETLCloud 还提供了基于 CDC &#xff08;Change Data Capture&#xff09;的实时数据集成功能&#xff1a;实时数据集成是指通过变化数据捕获技术&#…

3D建模对制造企业的价值

除非你在过去几年一直躲在岩石下,否则你可能听说过“3D 建模”和“3D 渲染”这些术语。 但为什么这项技术如此重要,尤其是对于产品制造公司而言? 简而言之,它减少了项目时间和成本。 这为制造商提供了更多的设计试验空间。 未能利用 3D 建模技术的公司很快就会落后于竞争对…

5.1每日一题(无穷级数敛散性的判断:莱布尼兹准则、p级数、绝对收敛、条件收敛、比较法/比较法的极限形式)

莱布尼兹准则&#xff1a;&#xff08;1&#xff09;单调递减&#xff1b;&#xff08;2&#xff09;极限 -> 0 绝对收敛&#xff1a;级数的绝对值收敛 条件收敛&#xff1a;级数的绝对值发散 p级数的次幂 <1 时发散 &#xff1b;>1时收敛

微信小程序文件预览和下载-文件系统

文件预览和下载 在下载之前&#xff0c;我们得先调用接口获取文件下载的url 然后通过wx.downloadFile将下载文件资源到本地 wx.downloadFile({url: res.data.url,success: function (res) {console.log(数据,res);} })tempFilePath就是临时临时文件路径。 通过wx.openDocume…

Kotlin学习——kt中的类,数据类 枚举类 密封类,以及对象

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

【LeetCode 热题 HOT 100】题解笔记 —— Day01

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

spring boot整合Jasypt实现配置加密

文章目录 目录 文章目录 前言 一、Jasypt是什么&#xff1f; 二、使用步骤 1.引入 2.测试使用 3.结果 总结 前言 一、Jasypt是什么&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#xff0c;提供了一种简单的加密解密方式&#xff0c…

【JVM系列】- 穿插·对象的实例化与直接内存

对象的实例化与直接内存 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; 文章目录…