10 vue3之全局组件,局部组件,递归组件,动态组件

news2024/9/20 4:18:54

全局组件

使用频率非常高的组件可以搞成全局组件,无需再组件中再次import引入

在main.ts 注册


import Card from './components/Card/index.vue'
 
 
createApp(App).component('Card',Card).mount('#app')

使用方法

直接在其他vue页面 立即使用即可 无需引入

<template>
  <card></card>
</template>

批量注册全局组件

 可以参考element ui 其实就是遍历一下然后通过 app.component 注册

 局部组件

在组件内部使用import引入的

<template>
  <div class=""></div>
  <son></son>
  <son2 :title="'父组件传来的title'"></son2>
</template>

<script setup lang="ts">
import son from "./components/son_eight.vue";
import son2 from "./components/son_eight2.vue";
</script>

配置递归组件

原理跟我们写js递归是一样的 自己调用自己 通过一个条件来结束递归 否则导致内存泄漏

案例递归树

在父组件配置数据结构 数组对象格式 传给子组件

<script setup lang="ts">
<template>
  <h2>递归组件案例--</h2>
  <Tree @emit="get" :data="data"></Tree>

</template>

<script setup lang="ts">
import {
  ref,
  reactive,
  markRaw,
  shallowRef,
  shallowReactive,
} from "vue";
import Tree from "./components/nine_tree.vue";

type TreeList = {
  name: string;
  icon?: string;
  children?: TreeList[] | [];
};
const data = reactive<TreeList[]>([
  {
    name: "no.1",
    children: [
      {
        name: "no.1-1",
        children: [
          {
            name: "no.1-1-1",
          },
        ],
      },
    ],
  },
  {
    name: "no.2",
    children: [
      {
        name: "no.2-1",
      },
    ],
  },
  {
    name: "no.3",
  },
]);

let get = (name) => {
  console.log("父组件接收的值", name);
};
</script>

TreeItem.vue子组件 直接使用组件名字

<template>
  <div
    style="margin-left: 40px"
    :key="index"
    @click.stop="send(item)"
    v-for="(item, index) in data"
  >
    <div>{{ item.name }}</div>
    <!--
      @emit="send"  组件需要再次派发 这里是细节的地方
      控制台输出以下内容
      let obj = {
        name: ''
    }
    obj.children // undefined
    obj.children.length // 直接报错
    obj.children?.length // undefined
    obj.children?.length ?? 1 // 1
    null ?? 1 // 1
    false ?? 1 // false ,?? 只处理左边undefined 和null 的情况
      
    -->
    <TreeItem
      @emit="send"
      v-if="item?.children?.length"
      :data="item.children"
    ></TreeItem>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
type TreeList = {
  name: string;
  icon?: string;
  children?: TreeList[] | []; // 代表children可以不传 也可以传但是接收的同样是TreeList类型 也可以传空数组
};
type Props = {
  data?: TreeList | []; // 这里处理很细节
};
defineProps<Props>();

let emit = defineEmits(["emit"]);
let send = (item) => {
  emit("emit", item);
};
</script>

或者再次添加个script

<script lang="ts">
export default {
  name:"TreeItem"
}
</script>

效果图:

 

动态组件

     父组件   

<template>
  <h3>动态组件案例--</h3>
  <!-- 不能是两个动态的 最多只支持一个动态和一个静态 -->
  <div
    :class="[active == index ? 'active' : '']"
    v-for="(item, index) in comList"
    :key="index"
  >
    <button @click="switchTab(item)">{{ item.tab }}</button>
  </div>
  <component :is="current.name"></component>
  <h3>字符串的方式</h3>
  <component is="C"></component>
</template>

<script setup lang="ts">
import {
  ref,
  reactive,
  markRaw,
  shallowRef,
  shallowReactive,
} from "vue";
import A from "./components/nine_A.vue";
import B from "./components/nine_B.vue";
import C from "./components/nine_C.vue";


// 动态组件
// vue2中是通过组件的name做渲染,vue3中setup是通过组件的实例来做渲染

type Com = {
  tab: string;
  name: string;
};
type Cur = Pick<Com, "name">; // Pick 从Com中提取出name 作为字面量泛型
let comList = reactive<Com[]>([
  {
    tab: "我是A组件",
    name: shallowReactive(A),
    // name: "A", // 警告是由于reactive做了代理proxy 导致组件也做了代理,组件代理是没必要的所以节省开销我们使用 ShallowReactive, ShallowReactive,show
  },
  {
    tab: "我是B组件",
    name: shallowReactive(B),
  },
]);

let active = ref<number>(0);

let current = reactive<Cur>({
  name: comList[0].name, // 默认展示第一个组件
});
let switchTab = (item, index) => {
  current.name = item.name;
  active.value = index;
  console.log(current.name.value);
};
</script>

<script lang="ts">
export default {
  components: {
    C,
  },
};
</script>

<style lang="scss" scoped>
.active {
  background: pink;
}
</style>

A.vue

<template>
  <div class="">aaaaaaaaaaaaaa</div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>

<style lang="sass" scoped></style>

B.vue

<template>
  <div class="">bbbbbbbb</div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>

<style lang="sass" scoped></style>

C.vue

<template>
  <div class="">
    <h3>vue3 第二种动态组件的方式使用</h3>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
</script>

<style lang="sass" scoped></style>

效果图:

11 vue3之插槽全家桶-CSDN博客11 vue3之插槽全家桶。https://blog.csdn.net/qq_37550440/article/details/142326456?sharetype=blogdetail&sharerId=142326456&sharerefer=PC&sharesource=qq_37550440&spm=1011.2480.3001.8118

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

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

相关文章

240919-Pip先在线下载不安装+再离线安装

A. 最终效果 # 使用modelscope sdk下载模型 import os os.environ[MODELSCOPE_CACHE] 您希望的下载路径from modelscope import snapshot_download model_dir snapshot_download(opendatalab/PDF-Extract-Kit) print(f"模型文件下载路径为&#xff1a;{model_dir}/model…

【新手上路】衡石分析平台使用手册-认证方式

认证方式​ 用户登录衡石系统时&#xff0c;系统需要对输入的用户名和密码进行验证&#xff0c;保证系统的安全。衡石提供 CAS、SAML2、OAUTH2等多种单点登录认证方式。在 SSO 单点登录中&#xff0c;衡石是服务提供者 SP&#xff08;Service Provider&#xff09;为用户提供所…

synchronized是怎么实现的?

synchronized是JVM的语法糖&#xff0c;主要是通过JVM来控制的。其实现原理依赖于JVM的监视器和对象头。 synchronized修饰方法时&#xff0c;JVM会通过编译完的字节码的访问标记来区分该方法是否被synchronized修饰&#xff0c;在进入方法的时候就会进行获得锁的竞争&#xff…

鸿蒙媒体开发系列06——输出设备与音频流管理

如果你也对鸿蒙开发感兴趣&#xff0c;加入“Harmony自习室”吧&#xff01;扫描下方名片&#xff0c;关注公众号&#xff0c;公众号更新更快&#xff0c;同时也有更多学习资料和技术讨论群。 1、音频输出设备管理 有时设备同时连接多个音频输出设备&#xff0c;需要指定音频输…

python 爬虫 selenium 笔记

todo 阅读并熟悉 Xpath, 这个与 Selenium 密切相关、 selenium selenium 加入无图模式&#xff0c;速度快很多。 from selenium import webdriver from selenium.webdriver.chrome.options import Options# selenium 无图模式&#xff0c;速度快很多。 option Options() o…

栈、队列、链表

基于《啊哈&#xff01;算法》和《数据结构》&#xff08;人民邮电出版社&#xff09; 本博客篇幅较多&#xff0c;读者根据目录选择&#xff0c;不理解的可留言和私信。 栈、队列、链表都是线性结构。 三者都不是结构体、数组这种数据类型&#xff0c;我认为更像是一种算法…

面试必备!值得收藏!不容错过的100+ 大语言模型面试问题及答案

引言 大语言模型&#xff08;LLMs&#xff09;现在在数据科学、生成式人工智能&#xff08;GenAI&#xff0c;即一种借助机器自动产生新信息的技术&#xff09;和人工智能领域越来越重要。这些复杂的算法提升了人类的技能&#xff0c;并在诸多行业中推动了效率和创新性的提升。…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下&#xff0c;如何查看已缓存的DNS信息呢? 1.打开“运行”&#xff0c;输入cmd&#xff0c;点击“确定” 2.在命令行界面输入ipconfig /displaydns&#xff0c;按回车即可查看已缓存的dns信息

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构&#xff08;Service Oriented Architecture, SOA&#xff09;实施需要复杂的基础技术作为支撑&#xff0c;伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署&#xff0c;将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

分享几种方式获取免费精致的Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…

房屋租赁系统源码分享:SpringBoot + Vue 免费分享

这是一套使用 SpringBoot 与 Vue 开发的房屋租赁系统源码&#xff0c;站长分析过这套源码&#xff0c;推测其原始版本可能是一个员工管理系统&#xff0c;经过二次开发后&#xff0c;功能被拓展和调整&#xff0c;现已完全适用于房屋租赁业务。 源码说明&#xff1a; 该系统功…

一键生成高级感PPT封面,首推这个在线AI生成PPT软件!

PPT封面怎么做&#xff1f; ppt封面的重要性不言而喻&#xff0c;就像写文章讲究的“凤头”&#xff0c;一个漂亮的PPT封面&#xff0c;可以吸引观众的注意力&#xff0c;让人有意愿驻足下来听你演讲&#xff0c;才会有后面更多的故事发生。 漂亮的ppt封面怎么做&#xff1f;…

dll文件丢失怎么恢复?10种dll修复方法任你选,一次学会!

dll文件丢失怎么恢复&#xff1f;dll文件丢失在多个Windows 版本中都是常见的问题&#xff0c;包括win7/win8/win10和 win11。这类错误通常与一些特定的dll文件有关&#xff0c;比如MSVCR110.DLL、MSVCR71.DLL、d3compiler_43.DLL、LogiLDA.DLL、MSVCP140.DLL、api-ms-win-crt-…

组装电脑-电脑配置

键盘、鼠标&#xff1a;买一百多的机械盘。 主板 电脑台式机主板是计算机最基本的同时也是最重要的部件之一&#xff0c;它在整个计算机系统中扮演着举足轻重的角色。以下是对它的详细介绍&#xff1a; 基础功能&#xff1a; 主板作为计算机的核心部件&#xff0c;负责连接和…

【图像检索】基于颜色模型的图像内容检索,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于颜色模型的图像内容检索&#xff0c;用matlab实现。 一、案例背景和算法介绍 这…

inBuilder低代码平台新特性推荐-第二十四期

今天给大家带来的是 inBuilder 低代码平台新特性推荐第二十四期 ——表单格式支持流程配置。 场景介绍&#xff1a; 如下图所示&#xff0c;目前支持在流程设计上的不同节点设置表单字段的必填、显隐等属性控制&#xff0c;不必在表单设计上进行配置&#xff0c;从而减少了开…

VS Code远程连接虚拟机

VS Code远程连接虚拟机 1.下载vscode2.打开VS Code下载Remote-SSH插件1.修改相关信息 3.虚拟机检查或安装ssh4.检查虚拟机服务是否安装成功5.开启ssh&#xff0c;并检查是否开启成功 1.下载vscode 2.打开VS Code下载Remote-SSH插件 1.修改相关信息 2. 3.虚拟机检查或安装ssh…

同一个单元格内包含标签和文本框

<!DOCTYPE html> <html> <head> <title>单元格内包含标签和文本框</title> <style> /* 可选的CSS样式&#xff0c;用于美化表格 */ table { width: 50%; /* 设置表格宽度为页面宽度的50% */ border-collapse: collapse; /* 合并…

【JSrpc破解前端加密问题】

目录 一、背景 二、项目介绍 三、JSrpc 处理前端加密步骤 一、背景 解决日常渗透测试、红蓝对抗中的前端密码加密问题&#xff0c;让你的爆破更加丝滑&#xff1b;降低js逆向加密的难度&#xff0c;降低前端加密逻辑分析工作量和难度。 二、项目介绍 运行服务器程序和js脚本…

解锁生命活力密码!帕金森患者的专属锻炼秘籍,让每一步都稳健前行

在这个快节奏的时代&#xff0c;健康成为了我们最宝贵的财富之一。然而&#xff0c;对于帕金森病患者而言&#xff0c;身体的逐渐僵硬、运动能力的下降&#xff0c;似乎给生活按下了减速键。但请相信&#xff0c;科学的锻炼方法&#xff0c;就是那把重启生命活力的钥匙&#xf…