首页 > 其他分享 > vuejs3.0 从入门到精通——动态组件

vuejs3.0 从入门到精通——动态组件

时间:2023-11-10 10:57:43浏览次数:35  
标签:vue 入门 vuejs3.0 响应 组件 tabList com name

动态组件

一、App.vue

<template>
  <ul> <!-- 使用ul标签替代了错误的url标签,用于展示列表 -->
    <li v-for='(item, index) in tabList' :key='index' @click="() => { currentComponent.com = tabList[index].com }">
      <!-- 使用v-for指令遍历tabList数组,生成列表项,其中item是当前遍历的元素,index是索引 -->
      {{ item.name }} <!-- 使用双大括号插值表达式展示item的name属性 -->
    </li>
  </ul>
  <component :is="currentComponent.com"></component>
  <!-- :is 是一个特殊的属性,用于动态地绑定一个组件到其标签名。根据currentComponent.com的值来决定具体渲染哪个组件 -->
</template>

<script setup lang="ts">
import { reactive } from 'vue'; // 引入vue的reactive API,用于创建响应式对象
import A from './components/A.vue'; // 引入A组件
import B from './components/B.vue'; // 引入B组件
import C from './components/C.vue'; // 引入C组件
import { DefineComponent } from 'vue'; // 引入DefineComponent类型,用于更精确地定义组件类型

interface TabItem { // 定义TabItem接口,用于约定tabList中对象的结构
  name: string; // name属性是字符串类型
  com: DefineComponent<any, any, any>; // com属性是一个组件类型,这里使用any是为了简化,实际使用时需要具体定义组件的props、emits等类型
}

let tabList = reactive<TabItem[]>([ // 创建响应式对象tabList,它的类型是TabItem数组
  { name: 'A准备好面试题', com: A }, // 数组的第一个元素,name是字符串,com是A组件
  { name: 'B准备简历', com: B }, // 数组的第二个元素,name是字符串,com是B组件
  { name: 'C准备面试', com: C } // 数组的第三个元素,name是字符串,com是C组件
]);

let currentComponent = reactive<any>({ com: tabList[0].com }); // 创建响应式对象currentComponent,它的类型是any,初始时com属性指向tabList的第一个元素的com属性,即A组件
</script>

二、components

A.vue:

<!--子组件: A 组件-->

<template>
    <div>
        <h1>A组件</h1>
    </div>
</template>

B.vue:

<!--子组件: B 组件-->

<template>
    <div>
        <h1>B组件</h1>
    </div>
</template> 

C.vue:

<!--子组件: C 组件-->

<template>
    <div>
        <h1>C组件</h1>
    </div>
</template>

三、运行结果

四、console有报错

报错解释如下:

这个报错信息与 Vue 3 的响应式系统有关。在 Vue 3 中,使用了 reactive 和 ref 等 API 来创建响应式对象或值,以便在它们发生变化时能够自动更新相关的组件。
然而,在某些情况下,我们可能不希望某些对象或组件被转化为响应式的。在这种情况下,可以使用 markRaw 或者在创建引用时使用 shallowRef,以减少不必要的性能开销。
报错信息告诉我们,一个组件被转化成了响应式对象,这可能会导致性能上的不必要开销。它建议我们使用 markRaw 或者 shallowRef 来避免这种情况。
具体来说:
  markRaw:此函数可以标记一个对象,使其不会被转化为响应式的。这意味着该对象的任何变化都不会触发组件的更新。
  shallowRef:这是一种创建引用的方式,与 ref 不同,它创建的引用只会在其直接引用的值发生变化时触发更新,而不会深入到引用的内部去检测其属性的变化。
在你的情况下,如果 A.vue 组件不应该被转化为响应式的,你可以尝试使用 markRaw 来标记它。如果 A.vue 组件需要被转化为响应式的,但其内部某些属性不需要被响应式,你可以尝试使用 shallowRef 来创建这些属性的引用。

 

标签:vue,入门,vuejs3.0,响应,组件,tabList,com,name
From: https://www.cnblogs.com/zuoyang/p/17823554.html

相关文章

  • 神经网络入门篇:详解计算一个神经网络的输出(Computing a Neural Network's output)
    一个神经网络的输出首先,回顾下只有一个隐藏层的简单两层神经网络结构:图1.3.1其中,\(x\)表示输入特征,\(a\)表示每个神经元的输出,\(W\)表示特征的权重,上标表示神经网络的层数(隐藏层为1),下标表示该层的第几个神经元。这是神经网络的符号惯例,下同。神经网络的计算关于神经网络是怎......
  • 天池AI练习生计划 - 第一期Pyhton入门与实践 正式上线!通关赢取双重礼品!
    天池AI练习生养成计划是为天池入门学习用户准备的训练营,用户通关后可获得学习奖励,从学习者蜕变为AI新星!轻松来闯关,即可领取双重礼品~实训培训证书:通关两个关卡即可领取阿里云定制鼠标:通关全部关卡即可领取活动地址:https://tianchi.aliyun.com/specials/promotion/trainee活......
  • Android入门教程 | RecyclerView使用入门
    ......
  • 一对多数据关系处理利器:JVS子表格组件详解
    在数字化时代,表单已经成为企业、机构和个人收集、整理、分析数据的重要工具。然而,随着数据复杂性的增长,传统的单一表单往往难以满足需求。JVS低代码表单引擎中子表格允许在主表单中嵌套另一个子表数据,使得数据的收集和组织更加有序、高效。尤其在处理多对一或多对多的关系数据时,如......
  • 【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架
     万冬阳公司:中国科学院软件所小组:知识体系工作组 简介Easyui是一套基于ArkTS语言开发的轻量、可靠的移动端组件库,它是对OpenAtom OpenHarmony(以下简称“OpenHarmony”) ArkUI进行深度定制的组件框架。Easyui可扩展性较强,可以基于源码进行二次开发,修改原有组件以及新增......
  • Day02java入门
    所有学习内容来自:狂神说javaJava入门高可用、高性能、高并发主要学习:Maven、Tomcat、Spring、Hadoop、myBatisjava优势及特性:​ 简单性、面向对象、可移植、高性能、分布式、动态性、多线程、安全性、健壮性JDK、JRE、JVM:环境安装卸载JDK高级系统设置环境变量删除JAV......
  • Ansible自动化部署工具-组件及语法介绍
    大家好,我是蓝胖子,我认为自动化运维要做的事情就是把运维过程中的某些步骤流程化,代码化,这样在以后执行类似的操作的时候就可以解放双手了,让程序自动完成。避免出错,Ansible就是这方面非常好用的工具。它能将我们的安装软件,部署等过程进行代码编排,程序化我们的部署步骤。今天,我们就......
  • indexDB数据库快速入门
    indexDB简介indexDB本质上就是存储数据,优点不受大小限制,当数据大于>5MB时我们无法通过localStorage、cookie(只能存4k)存储//连接数据库(连接的过程是一个异步的)window.indexedDB.open('库名称','库版本号')>=0constrequest=window.indexedDB.open('......
  • 神经网络入门篇:详解神经网络概述和表示
    神经网络概述(NeuralNetworkOverview)先开始快速浏览一下如何实现神经网络。上篇博客了解了逻辑回归,了解了这个模型(见图1.1.1)如何与下面公式1.1建立联系。图1.1.1:公式1.1:\[\left. \begin{array}{l} x\\ w\\ b \end{array} \right\} \implies{z={w}^Tx+b}\]如上所......
  • 界面组件DevExpress ASP.NET Core v23.1 - 进一步升级UI组件
    DevExpressASP.NETCore Controls使用强大的混合方法,结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NETRazor标记和服务器端ASP.NETCoreWebAPI的生产力和简便性,提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的MaterialDesign、通用主题集可以让......