Vue3从入门到实践:深度了解新组件

1.Teleport

概念:Teleport(传送门)是一个新的特性,用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置,而不受组件层次结构的限制。

下面举出例子解释: 

1.新建App.vue文件作为父组件

解析:这段代码的作用是创建一个外层容器,显示一个标题、一张图片,并包含一个自定义的模态框组件。 

 2.新建Modal.vue作为子组件

解析:这段代码是一个简单的Vue单文件组件,用于实现一个点击按钮展示模态框的功能。

展示:

 

点击”展示窗口后“ 按钮后

这样看,你可能会认为窗口以父元素为参考,其实不然,而是整个视口

所以给你修改了一下窗口样式,使其更明显些

3. 此时我在父组件Css属性添加一个关于饱和度(filter)的属性

4. 然后再点击”展示窗口“,你会发现窗口不能再参考视口了,而是父元素容器了。

提醒:这里父元素和窗口是包裹关系(父子组件嘛)

所以这里强调的是父组件的某些属性会影响了窗口的(position: fixed),这时候可以引用Teleport了

5.在Modal.vue将模块放入到Teleport中

解析:以上代码使用了<teleport>元素将弹窗的内容传送到body元素中,使其在DOM结构中脱离当前组件的范围,可以在任何位置显示。

所以Teleport可以将子容器的div传送到指定的容器里面,同时里面的逻辑不影响,只是结构放出去了。所以你可以将Teleport称之为”传送门“ 

App.vue代码:

<template>
	<div class="outer">
	  <h2>我是App组件</h2>
	  <img src="http://www.atguigu.com/images/index_new/logo.png" alt="">
	  <br>
	  <Modal/>
	</div>
  </template>
  
  <script setup lang="ts" name="App">
	import Modal from "./Modal.vue";
  </script>
  
  <style>
	.outer{
	  background-color: #ddd;
	  border-radius: 10px; 
	  padding: 5px;
	  box-shadow: 0 0 10px;
	  width: 400px;
	  height: 400px;
	  filter: saturate(200%);
	}
	img {
	  width: 270px;
	}
  </style>

 Modal.vue代码:

<template>
  <button @click="isShow = true">展示弹窗</button>
  <teleport to='body'>
    <div class="modal" v-show="isShow">
      <h2>我是弹窗的标题</h2>
      <p>我是弹窗的内容</p>
      <button @click="isShow = false">关闭弹窗</button>
    </div>
  </teleport>
</template>

<script setup lang="ts" name="Modal">
  import {ref} from 'vue'
  let isShow = ref(false)
</script>

<style scoped>
  .modal {
    width: 200px;
    height: 150px;
    background-color: skyblue;
    border-radius: 10px;
    padding: 5px;
    box-shadow: 0 0 5px;
    text-align: center;
    position: fixed;
    left: 50%;
    top: 20px;
    margin-left: -100px;
  }
</style>


2. Suspense 

 概念:

当我们在Vue 3中使用Suspense(悬挂)时,我们可以处理异步组件的加载状态和错误处理,以提供更好的用户体验。

想象一下,当一个组件需要一些时间来加载时,我们可以使用Suspense来展示一个等待状态,比如显示一个加载指示器或一个骨架屏,告诉用户正在加载中。一旦组件加载完成,它会被正常地显示出来。

另一方面,如果加载出现错误,Suspense可以帮助我们捕获这些错误并展示错误信息或备用内容。

所以,Suspense提供了一种在异步组件加载过程中处理加载状态和错误的方式,以确保用户能够知道正在发生的情况,并提供适当的反馈。通过使用Suspense,我们可以创建更流畅和友好的用户界面,提升用户体验。

 

  • 等待异步组件时渲染一些额外内容,让应用有更好的用户体验

  • 使用步骤:

    • 异步引入组件

    • 使用Suspense包裹组件,并配置好defaultfallback

import { defineAsyncComponent,Suspense } from "vue";
const Child = defineAsyncComponent(()=>import('./Child.vue'))

新建App.vue文件 

新建Child.vue文件:

在以上代码中,使用了await关键字来等待axios库发送GET请求并获取响应结果。这是因为发送网络请求是一个异步操作,需要等待服务器返回响应后才能获取到数据。

使用await关键字可以暂停代码的执行,直到异步操作完成并返回结果。在这个例子中,await关键字用于等待axios库发送GET请求并获取到服务器的响应结果。

通过使用await,可以确保在继续执行后续代码之前,已经获取到了API返回的数据。这样可以避免在数据还未返回时对未定义的数据进行操作。

 为什么呢?

在Vue的模板渲染过程中,当数据发生变化时,Vue会重新渲染模板以反映最新的数据状态。然而,在这段代码中,由于异步操作在初始化时就被执行,并且直接修改了sum的值,这会触发组件的重新渲染。

由于异步操作的执行时间是不确定的,可能会在组件的初始化阶段之后才完成,所以在组件初始化时,sum的初始值被渲染到模板中。然而,当异步操作完成后,sum的值被修改,导致组件重新渲染,此时没有提供标题的相关模板,因此导致标题消失。

如何解决呢?

 

在你提供的代码中,使用了<Suspense>组件来包裹异步加载的子组件<Child/>

<template v-slot:default>中,放置了实际的异步组件<Child/>。这表示在异步组件加载完成后,将显示<Child/>组件的内容。

<template v-slot:fallback>是一个占位内容,用于在子组件加载过程中显示。

你可以在这里放置一个加载状态的提示文本,例如<h2>加载中......</h2>。这段代码会在子组件加载完成之前显示,并在加载完成后被替换为<Child/>组件的内容。

通过使用<Suspense>组件和插槽(slot)的方式,你可以在异步加载的过程中提供一个加载状态的占位内容,以提升用户体验并避免页面显示空白。

  App.vue代码:

<template>
  <div class="app">
    <h2>我是App组件</h2>
    <Suspense>
      <template v-slot:default>
        <Child/>
      </template>
      <template v-slot:fallback>
         <h2>加载中......</h2> 
       </template>
    </Suspense>
  </div>
</template>
<script setup lang="ts" name="App">
  import {Suspense} from 'vue'
  import Child from './Child.vue'
</script>

<style>
  .app {
    background-color: #ddd;
    border-radius: 10px;
    padding: 10px;
    box-shadow: 0 0 10px;
  }
</style>

Child.vue代码:

<template>
  <div class="child">
    <h2>我是Child组件</h2>
    <h3>当前求和为:{{ sum }}</h3>
  </div>
</template>

<script setup lang="ts">
  import {ref} from 'vue'
  import axios from 'axios'

  let sum = ref(0)
  let {data:{content}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')
  console.log(content)

</script>

<style scoped>
  .child {
    background-color: skyblue;
    border-radius: 10px;
    padding: 10px;
    box-shadow: 0 0 10px;
  }
</style>

3.全局API转移到应用对象

概念:

在Vue 3中,许多全局API的使用方式有所变化。以前,你可能会在Vue构造函数上调用这些API,但现在你需要使用应用对象来访问它们。

想象一下,Vue应用程序就像是一个实际的应用。在Vue 2中,你可以直接从"Vue"这个大总管那里获取所有的全局功能,就像向一个人提出请求一样。但在Vue 3中,这些功能被放在了应用对象中,就像是应用程序的各个部分,你需要通过应用对象来访问它们。

简而言之:以前需要Vue.xxx ,现在只需要app.xxx,时代变了,哥们。

app.component表示可以在全局使用的组件

1.现在创建一个组件:Hello.vue

2.在main.ts引用导入

3. 现在已经作为全局变量了,现在直接在两个组件中使用

 

展示: 


app.config: 用于访问应用程序的全局配置对象。它提供了一种设置和访问全局配置选项的方式。

比如下面使用app.config.globalProperties可变为全局属性

1.在main.ts引入

2.可以使用了,比如我在两个其他组件使用 

 有报错,是我的编译器问题,可不必理会。

3.展示


app.directive:用于注册全局指令。


app.mount:是Vue.js中用于将应用程序挂载到特定元素上的方法 

app.unmount:卸载特定元素上的方法  

2s后整个页面卸载 


app.use :用于安装插件,常用的有路由器(Router)或者状态管理器(Pinia)


4.vue3的部分非兼容性改变

概念:其实就是Vue3的部分规则,在Vue2中不能这样写了。

  • 过渡类名 v-enter 修改为 v-enter-from、过渡类名 v-leave 修改为 v-leave-from

  • keyCode 作为 v-on 修饰符的支持。

  • v-model 指令在组件上的使用已经被重新设计,替换掉了 v-bind.sync。

  • v-ifv-for 在同一个元素身上使用时的优先级发生了变化。

  • 移除了$on$off$once 实例方法。

  • 移除了过滤器 filter

  • 移除了$children 实例 propert

建议去看官网,这是面试常问到的。 


总结:

  1. Teleport(传送门)是Vue 3中的一个新特性,它允许你将组件的内容渲染到DOM中的任意位置,而不受组件层次结构的限制。通过使用<teleport>元素和to属性,你可以将组件的内容传送到指定的DOM元素中,从而实现灵活的渲染位置。

  2. Suspense(悬挂)是Vue 3中用于处理异步组件加载状态和错误处理的特性。它允许你在异步组件加载过程中展示等待状态(如加载指示器或骨架屏),并处理加载错误。通过使用<Suspense>组件,你可以提供更好的用户体验,确保用户在等待加载时能够获得适当的反馈。

  3. 在Vue 3中,许多全局API已经从Vue构造函数转移到应用对象上。这是为了提供更模块化和可配置的应用程序结构。原先通过Vue.directiveVue.mixin等方式注册全局指令、混入等,现在需要使用应用对象(通过createApp函数创建)上的方法进行注册,例如app.directiveapp.mixin等。

  4. Vue 3引入了一些非兼容性的改变,这意味着在从Vue 2升级到Vue 3时,一些代码可能需要进行修改才能正常工作。其中一些改变包括更严格的模板编译、Composition API的引入、组件实例属性的更改等。为了平滑升级到Vue 3,官方提供了一些工具和指南,帮助开发者进行代码迁移和适配。需要仔细阅读Vue 3的官方文档和迁移指南,以了解这些非兼容性的改变并相应地修改代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构—单链表

1、链表的概念及结构 1.1链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;但在逻辑上确是连续、顺序的&#xff0c;而数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2链表的结构 如下图&#xff1a; 逻辑上的链表&#xff0c;pList是指…

AOP基础

一、AOP概述 AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实就是面向特定方法编程。 使用场景&#xff1a;①记录操作日志&#xff1b;②权限控制&#xff1b;③事务管理等。 优势&#xff1a;①代码无侵入…

【GPTs分享】GPTs分享之 AskYourPDF Research Assistant​

一、简介 AskYourPDF Research Assistant 是一款高级人工智能研究助手&#xff0c;专门设计用于帮助用户高效从PDF文件和文章中提取信息。它结合了深度学习技术和自然语言处理能力&#xff0c;以便用户能够快速地查询、总结及处理文档内容&#xff0c;并能够生成与文章内容相关…

依泉LXSY LXLY电子远传水表说明书MODBUS-RTU通讯协议

这款水表的通讯协议主要包括以下内容&#xff1a; 概述 传输方式 数据帧格式 地址码 功能码 数据区 CRC校验码 生成一个CRC的流程 通讯应用格式详解 寄存器地址 通讯接口 表盘地址 这是厂家给的通讯协议&#xff0c;我亲测可以读取到水表的读数&#xff0c;精度只…

怎么理解load_average

之前我讲了cpu使用率的问题&#xff0c;cpu使用率是我们监控中非常关注的指标。 但是工作中&#xff0c;我们经常遇到业务应用已经很慢了&#xff0c;但是cpu利用率显示很低。 这种时候&#xff0c;你会发现top中load很高。 在top中&#xff0c;load average后面有3个数字。…

AtCoder ABC349 A-D题解

比赛链接:ABC349 Problem A: 签到。 #include <bits/stdc.h> using namespace std; const int maxn105; int A[maxn]; int main(){int N;cin>>N;int ans0;for(int i1;i<N;i){cin>>A[i];ans-A[i];}return 0; } Problem B: 开2个桶即可&#xff0c;具体…

西夏区第三届中华诗词大会活动方案

活动流程/比赛规则 1.【13:30-14:10】 参赛选手签到&#xff1b;领取参赛号码牌&#xff1b;分组抽签&#xff1b;拍摄赛前感言&#xff0c;集体祝福口号&#xff1b; 2.【14:10-14:25】 熟悉设备、答题环节、题目设置等&#xff0c;走台演练 3.【14:25-14:30】 播放暖场视频…

java音乐播放器系统设计与实现springboot-vue

后端技术 SpinrgBoot的主要优点有&#xff1a; 1、为所有spring开发提供了一个更快、更广泛的入门体验&#xff1b; 2、零配置&#xff1b; 3、集成了大量常用的第三方库的配置&#xff1b; Maven: 项目管理和构建自动化工具&#xff0c;用于java项目。 java: 广泛使用的编程语…

导航菜单 父级高亮 处理

// 预处理导航数据filterMenuFun (arr, uuids []) {// uuids 用来有级嵌套导航时&#xff0c;子集acitve时父级也有acitve样式arr.forEach(item > {item.uuids [item.uuid, ...uuids];item.children && this.filterMenuFun(item.children, item.uuids)});return a…

【触想智能】如何选购到一款合适的工业电脑一体机

工业电脑一体机是专为工业环境而设计的一种工业计算机。工业电脑一体机和普通的计算机不一样&#xff0c;它对产品的参数性能要求很高&#xff0c;因为它们通常会运行在高低温、电磁干扰、高粉尘、湿度大的恶劣环境中&#xff0c;所以相应的要求工业电脑一体机必须具备良好的宽…

openplc Linux 使用modbus RTU 从机通讯

1.Linux 环境下&#xff0c;openplc 默认使用的是modbus tcp协议通信。 想要使用串口 modbus rtu 通讯可以通过在runtime中添加SlaveDevices从机设备 2.添加设备&#xff0c;分配地址。 左边添加串口配置&#xff0c;右边是需要通讯的地址&#xff0c;从机地址都是从100开始&am…

【Linux】创建IDEA桌面快捷方式

Linux系统安装IDEA保姆级教程_linux安装idea-CSDN博客 在Ubuntu上安装Intellij IDEA并创建桌面快捷方式 - 极客子羽 - 博客园 (cnblogs.com) 下载安装包解压到指定目录 /opt/softWare 进入bin目录&#xff0c;ll查看 桌面打开终端&#xff0c;创建文件 touch idea.desktop s…

C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码

C语言C/&#xff33;架构PACS影像归档和通信系统源码 医院PACS系统源码 医院影像科PACS系统&#xff0c;意为影像归档和通信系统。它是应用在医院影像科室的系统&#xff0c;主要的任务是把日常产生的各种医学影像&#xff08;包括核磁、CT、超声、各种X光机、各种红外仪、显微…

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务&#xff0c;在做一些判断的时候&#xff0c;判断等级是不是满足需求。 比如如下场景&#xff1a;在进入副本的时候需要检查玩家等级是否满足&#xff0c;满足之后才…

ELK+Kafka+Zookeeper日志收集系统

环境准备 节点IP节点规划主机名192.168.112.3Elasticsearch Kibana Logstash Zookeeper Kafka Nginxelk-node1192.168.112.3Elasticsearch Logstash Zookeeper Kafkaelk-node2192.168.112.3Elasticsearch Logstash Zookeeper Kafka Nginxelk-node3 基础环境 sys…

【错题集-编程题】腐烂的苹果(多源 BFS + 最短路)

题目链接&#xff1a;腐烂的苹果_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 多源 BFS 问题&#xff0c;加一点最短路的思想&#xff0c;固定套路。 二、代码 //看了题解之后AC的代码 class Solution { private:int n, m;bool vis[1010][1010];int dx[4]{-1,0,1,0}, dy[4]{…

ceph介绍

一、前言 Ceph 是一个完全分布式的系统&#xff0c;它将数据分布在整个集群中的多个节点上&#xff0c;以实现高可用性和容错性&#xff0c;ceph支持对象存储、块存储、文件存储所以被称为统一存储&#xff0c;ceph的架构由以下组件组成:mon、mgr、osd、mds、cephfs、rgw&#…

域名信息查询同款WHOIS源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 域名查询一般是指查询域名的whois注册信息&#xff0c;域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时&#xff0c;很多用户希望进一步了解域名、名…

Kotlin语法入门--变量声明(2)

Kotlin语法入门–条件控制和循环语句&#xff08;2&#xff09; 文章目录 Kotlin语法入门--条件控制和循环语句&#xff08;2&#xff09;二、条件控制和循环语句1、if...else2、when2.1、常规用法2.2、特殊用法--并列&#xff1a;2.3、特殊用法--类型判断&#xff1a;2.4、特殊…

【笔试训练】day6

1.大数加法 思路&#xff1a; 高精度板子&#xff0c;停留一下都是罪过&#xff01; 代码&#xff1a; class Solution { public:string solve(string s, string t) {vector<int> a;vector<int> b;for(int is.size()-1;i>0;i--)a.push_back(s[i]-0);for(int …