Vue 3 第十四章:组件五(内置组件-transitiontransition-group)

news2024/11/25 15:01:02

文章目录

    • 1. transition组件
      • 1.1. 基本用法
      • 1.2. css过渡class介绍
      • 1.3. 过渡效果命名
        • 1.3.1. 基本用法
      • 1.4. 配合自定义动画(animation)使用
      • 1.5. 自定义过渡 class
      • 1.6. `<Transition>`组件生命周期
      • 1.7. transition 常用场景
    • 2. transition-group组件
      • 2.1. 基本用法

在Vue3中,内置了许多组件,可以帮助我们更方便地开发应用程序。在本篇博客中,我们将介绍 transition& transition-group组件,以及它们的用法。

1. transition组件

<transition>组件用于在元素插入或删除时添加过渡效果。例如,当我们在一个列表中添加或删除项目时,可以使用<transition>组件为这些操作添加一个动画效果。具体用法如下:

1.1. 基本用法

<template>
  <div>
    <button @click="show = !show">显示/隐藏</button>
    <transition>
      <div v-if="show">Hello, World!</div>
    </transition>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
const show = ref(false)

</script>

<style scoped>
.v-enter-active,
.v-leave-active {
  transition: opacity 2s ease;
}

.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

在上面的代码中,我们使用<transition>组件将<div>元素包裹起来。当条件showtrue时,<div>元素会被插入到DOM中,并且会显示一个过渡动画。当条件showfalse时,<div>元素会从DOM中删除。

1.2. css过渡class介绍

未命名时一共有 6 个应用于进入与离开过渡效果的 CSS class。
在这里插入图片描述

  • v-enter-from:进入动画的起始状态。在元素插入之前添加,在元素插入完成后的下一帧移除。

  • v-enter-active:进入动画的生效状态。应用于整个进入动画阶段。在元素被插入之前添加,在过渡或动画完成之后移除。这个 class 可以被用来定义进入动画的持续时间、延迟与速度曲线类型。

  • v-enter-to:进入动画的结束状态。在元素插入完成后的下一帧被添加 (也就是 v-enter-from 被移除的同时),在过渡或动画完成之后移除。

  • v-leave-from:离开动画的起始状态。在离开过渡效果被触发时立即添加,在一帧后被移除。

  • v-leave-active:离开动画的生效状态。应用于整个离开动画阶段。在离开过渡效果被触发时立即添加,在过渡或动画完成之后移除。这个 class 可以被用来定义离开动画的持续时间、延迟与速度曲线类型。

  • v-leave-to:离开动画的结束状态。在一个离开动画被触发后的下一帧被添加 (也就是 v-leave-from 被移除的同时),在过渡或动画完成之后移除。

1.3. 过渡效果命名

对于一个有名字的过渡效果,对它起作用的过渡 class 会以其名字而不是v作为前缀。下面是一个过渡命名的例子:

1.3.1. 基本用法

<template>
  <div>
    <button @click="show = !show">显示/隐藏</button>
    <transition name="hide">
      <div v-if="show">Hello, World!</div>
    </transition>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
const show = ref(false)

</script>

<style scoped>
.hide-enter-active,
.hide-leave-active {
  transition: opacity 2s ease;
}

.hide-enter-from,
.hide-leave-to {
  opacity: 0;
}
</style>

注意:<Transition> 一般都会搭配原生 CSS 过渡一起使用,正如上面的例子中所看到的那样。这个transition CSS属性是一个简写形式,使我们可以一次定义一个过渡的各个方面,包括需要执行动画的属性持续时间速度曲线

1.4. 配合自定义动画(animation)使用

原生 CSS 动画CSS transition的应用方式基本上是相同的,只有一点不同,那就是*-enter-from不是在元素插入后立即移除,而是在一个animationend事件触发时被移除。

对于大多数的 CSS 动画,我们可以简单地在 *-enter-active *-leave-active class下声明它们。下面是一个示例:

<template>
  <div>
    <button @click="show = !show">显示/隐藏</button>
    <transition name="hide">
      <div v-if="show">Hello, World!</div>
    </transition>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
const show = ref(false)

</script>

<style scoped>
.hide-enter-active {
  animation: scsle-in 0.5s;
}

.hide-leave-active {
  animation: scsle-in 0.5s reverse;
}
@keyframes scsle-in {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(1.25);
  }
  100% {
    transform: scale(1);
  }
}
</style>

1.5. 自定义过渡 class

可以向<Transition>传递以下的 props 来指定自定义的过渡 class:

  • enter-from-class
  • enter-active-class
  • enter-to-class
  • leave-from-class
  • leave-active-class
  • leave-to-class

传入的这些 class 会覆盖相应阶段的默认 class 名。这个功能在你想要在 Vue 的动画机制下集成其他的第三方 CSS 动画库时非常有用,比如 Animate.css

<template>
	<button @click="show = !show">Toggle</button>
  <Transition
    name="custom-classes"
    enter-active-class="animate__animated animate__tada"
    leave-active-class="animate__animated animate__bounceOutRight"
  >
    <p v-if="show">hello</p>
  </Transition>
</template>

<script setup>
import { ref } from 'vue'

const show = ref(true)
</script>

<style>
@import "https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css";
</style>

1.6. <Transition>组件生命周期

<Transition
  @before-enter="onBeforeEnter"
  @enter="onEnter"
  @after-enter="onAfterEnter"
  @enter-cancelled="onEnterCancelled"
  @before-leave="onBeforeLeave"
  @leave="onLeave"
  @after-leave="onAfterLeave"
  @leave-cancelled="onLeaveCancelled"
>
  <!-- ... -->
</Transition>
// 在元素被插入到 DOM 之前被调用
// 用这个来设置元素的 "enter-from" 状态
function onBeforeEnter(el) {}

// 在元素被插入到 DOM 之后的下一帧被调用
// 用这个来开始进入动画
function onEnter(el, done) {
  // 调用回调函数 done 表示过渡结束
  // 如果与 CSS 结合使用,则这个回调是可选参数
  done()
}

// 当进入过渡完成时调用。
function onAfterEnter(el) {}
function onEnterCancelled(el) {}

// 在 leave 钩子之前调用
// 大多数时候,你应该只会用到 leave 钩子
function onBeforeLeave(el) {}

// 在离开过渡开始时调用
// 用这个来开始离开动画
function onLeave(el, done) {
  // 调用回调函数 done 表示过渡结束
  // 如果与 CSS 结合使用,则这个回调是可选参数
  done()
}

// 在离开过渡完成、
// 且元素已从 DOM 中移除时调用
function onAfterLeave(el) {}

// 仅在 v-show 过渡中可用
function onLeaveCancelled(el) {}

1.7. transition 常用场景

  • 可复用过渡效果

vue中过渡效果是可以被封装复用的。要创建一个可被复用的过渡,我们需要为<Transition>组件创建一个包装组件,并向内传入插槽内容:

<!-- MyTransition.vue -->
<script>
// JavaScript 钩子逻辑...
</script>

<template>
  <!-- 包装内置的 Transition 组件 -->
  <Transition
    name="my-transition"
    @enter="onEnter"
    @leave="onLeave">
    <slot></slot> <!-- 向内传递插槽内容 -->
  </Transition>
</template>

<style>
/*
  必要的 CSS...
  注意:避免在这里使用 <style scoped>
  因为那不会应用到插槽内容上
*/
</style>

现在MyTransition可以在导入后像内置组件那样使用了:

<MyTransition>
  <div v-if="show">Hello</div>
</MyTransition>
  • 出现时过渡

如果你想在某个节点初次渲染时应用一个过渡效果,你可以添加 appear prop

<Transition appear>
  ...
</Transition>
  • 元素间过渡

除了通过v-if / v-show切换一个元素,我们也可以通过v-if / v-else / v-else-if在几个组件间进行切换,只要确保任一时刻只会有一个元素被渲染即可:

<Transition>
  <button v-if="docState === 'saved'">Edit</button>
  <button v-else-if="docState === 'edited'">Save</button>
  <button v-else-if="docState === 'editing'">Cancel</button>
</Transition>
  • 过渡模式

在之前的例子中,进入和离开的元素都是在同时开始动画的,因此我们不得不将它们设为position: absolute以避免二者同时存在时出现的布局问题。

然而,很多情况下这可能并不符合需求。我们可能想要先执行离开动画,然后在其完成之后再执行元素的进入动画。手动编排这样的动画是非常复杂的,好在我们可以通过向<Transition>传入一个mode prop来实现这个行为:`

<Transition mode="out-in">
  ...
</Transition>
  • 组件间过渡

<Transition>也可以作用于动态组件之间的切换:

<Transition name="fade" mode="out-in">
  <component :is="activeComponent"></component>
</Transition>
  • 动态过渡

<Transition>props (比如 name)也可以是动态的!这让我们可以根据状态变化动态地应用不同类型的过渡:

<Transition :name="transitionName">
  <!-- ... -->
</Transition>

这个特性的用处是可以提前定义好多组 CSS 过渡或动画的 class,然后在它们之间动态切换。

2. transition-group组件

<TransitionGroup> 支持和<Transition>基本相同的 propsCSS 过渡 class JavaScript 钩子监听器,但有以下几点区别:

  • 默认情况下,它不会渲染一个容器元素。但你可以通过传入tag prop来指定一个元素作为容器元素来渲染。

  • 过渡模式在这里不可用,因为我们不再是在互斥的元素之间进行切换。

  • 列表中的每个元素都必须有一个独一无二的 key attribute

  • CSS 过渡class会被应用在列表内的元素上,而不是容器元素上。

<transition-group>组件用于在多个元素插入或删除时添加过渡效果。例如,当我们在一个列表中添加或删除多个项目时,可以使用<transition-group>组件为这些操作添加一个动画效果。具体用法如下:

2.1. 基本用法

<template>
  <div>
    <button @click="handleAddLi">显示/隐藏</button>
    <transition-group tag="ul">
      <li v-for="item in items" :key="item.id">{{ item.text }}</li>
    </transition-group>
  </div>
</template>

<script setup lang="ts">
import { reactive } from 'vue';

const items = reactive([
  {
    id: 1,
    text: 'test1'
  },
  {
    id: 2,
    text: 'test2'
  }
])

const handleAddLi = () => {
  items.push({
    id: items.length + 1,
    text: 'test' + (items.length + 1)
  })
}

</script>

<style scoped>
.v-enter-active,
.v-leave-active {
  transition: opacity 2s ease;
}

.v-enter-from,
.v-leave-to {
  opacity: 0;
}
</style>

在上面的代码中,我们使用<transition-group>组件将一个<ul>元素包裹起来,并使用v-for指令渲染一个列表。

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

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

相关文章

Java基础(十一)日期时间API

1 JDK8之前&#xff1a;日期时间API 1.1 java.lang.System类的方法 System类提供的public static long currentTimeMillis()&#xff1a;用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。 此方法适用于计算时间差。 计算世界时间的主要标准有&#xff1a;…

SCAU 统计学 实验6

要确定不同培训方式对产品组装时间是否有显著影响&#xff0c;我们可以使用单因素方差分析&#xff08;One-way ANOVA&#xff09;。我们将使用以下数据&#xff1a; 培训方式 A 的样本数据 培训方式 B 的样本数据 培训方式 C 的样本数据 显著性水平&#xff08;α&#xff09…

windows下springboot集成ELK

ELK ElasticSearch Logstash Kibana的集合。ELK主要用于日志的集中管理、快速查询和分析。主要是通过 Logstash 将应用系统的日志通过 input 收集&#xff0c;然后通过内部整理&#xff0c;通过 output 输出到 Elasticsearch 中&#xff0c;其实就是建立了一个 index&#x…

【利刃出鞘】链式思维利用ChatGPT,让其成为工作中的利剑?附带初学者扫盲SpringBoot

【利刃出鞘】链式思维利用ChatGPT&#xff0c;让其成为工作中的利剑 一、一点思考二、技术学习——链式思维2.1 springboot注册bean的几种方式&#xff1f;2.2 springboot Component 注册的原理&#xff1f;2.3 springboot引用注册的Bean原理&#xff1f;2.4 private final MyB…

26-第一个Servlet项目

目录 1.Servlet是什么&#xff1f; 2.第一个Servlet项目 2.1.创建Maven项目 2.2.引入Servlet依赖&#xff08;将Maven项目改为Servlet项目(尚不完整)&#xff09; 2.3.完善Servlet项目目录——源代码目录&单元测试目录&#xff08;非必须&#xff09; 2.4.编写代码 …

4月24日作业

作业1 #include <iostream> using namespace std; template <typename T> class Node { private: T* p; //指针指向栈的首地址 int maxsize; //栈最大容量 int top-1; //栈顶 public: Node(){} //无参构造 Node(int max):maxsize(max)//有参构造 填最大容…

2022 ICPC Gran Premio de Mexico Repechaje 题解

目录 A. Average Walk&#xff08;签到&#xff09; 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; C. Company Layoffs&#xff08;签到&#xff09; 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; D. Denji1&#xff08;模拟/二分&#xff09; 思路&am…

Bsah shell的操作环境

文章目录 Bsah shell的操作环境路径与命令查找顺序使用案例 bash的登录与欢迎信息&#xff1a;/etc/issue、/etc/motdbash的环境配置文件如下login与non-login shell/etc/profile(login shell 才会读)~/.bash_profile(login shell 才会读)source&#xff1a;读入环境配置文件的…

简单介绍一下什么是“工作内存”和“主内存”(JMM中的概念)

在学习Java多线程编程里&#xff0c; volatile 关键字保证内存可见性的要点时&#xff0c;看到网上有些资料是这么说的&#xff1a;线程修改一个变量&#xff0c;会把这个变量先从主内存读取到工作内存&#xff1b;然后修改工作内存中的值&#xff0c;最后再写回到主内存。 对…

【基于gcc】手把手教你移植RT-Thread到STM32

前言 网上大多数移植RT-Thread系统的教程都是基于Keil的&#xff0c;下面将带来基于gcc版本的移植教程&#xff0c;若你还没有基于gcc的环境&#xff0c;可以查看我的这篇文章&#xff1a;VSCode搭建STM32开发环境 1、下载RT-Thread源码 RT-Thread有好几个版本&#xff0c;我…

小程序路由跳转

小程序中的路由只是单纯页面地址的跳转&#xff0c;一般在页面中使用 navigator 组件来实现&#xff0c;也有很多场景需要在 js 中根据逻辑的执行结果跳转到某个页面&#xff0c;比如&#xff1a;如果检测到用户尚未登录就需要给他跳转到登录页面 1.1navigate navigate 跳转到…

软件工程开发文档写作教程(04)—开发文档的编制策略

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 开发文档编制策略 文档策略是由上级(资深)管理者制订的&#xff0c;对下级开发单位或开发人…

银河麒麟 Server V10 离线源建立+部署

前言 这国产操作系统真神奇&#xff0c;docker CentOS7&#xff0c; MySQL CentOS8 简直了&#xff0c;这缝合技术真是绝了&#xff01; docker CentOS7 能装最新版 23 很顺利的&#xff01; MySQL CentOS8 也是最新版8.0.33的&#xff0c;也很顺利&#xff01; 系统版本 …

权威解析,软件测试的当下分析现状

Parasoft是一家专门提供软件测试解决方案的公司&#xff0c;Parasoft通过其经过市场验证的自动化软件测试工具集成套件&#xff0c;帮助企业持续交付高质量的软件。Parasoft的技术支持嵌入式、企业和物联网市场&#xff0c;通过将静态代码分析和单元测试、Web UI和API测试等所有…

详解树与二叉树的概念,结构,及实现(下篇)

目录 一&#xff0c; 二叉树链式实现 1. 前置说明 2. 二叉树遍历&#xff08;主打的就是一个分治思想&#xff09; 2. 1 前序遍历 2. 2 中序遍历 2. 3 后序遍历 2. 4 层序遍历 3. 二叉树结点个数及高度 3. 1 二叉树节点个数 3. 2 二叉树叶子节点个数 3. 3 二叉树第…

数字信号处理技术(三)自适应噪声完备集合经验模态分解(CEEMDAN)-Python代码

本文仅对自适应噪声完备集合经验模态分解&#xff08;CEEMDAN&#xff09;的原理简单介绍和重点介绍模型的应用。 1. CEEMDAN原理 CEEMDAN&#xff08;Complete Ensemble Empirical Mode Decomposition with Adaptive Noise&#xff09;的中文名称是自适应噪声完备集合经验模…

一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

文章目录 一&#xff1a;概述二&#xff1a;间隔与支持向量三&#xff1a;对偶问题&#xff08;1&#xff09;什么是对偶问题&#xff08;2&#xff09;SVM对偶问题&#xff08;3&#xff09;SMO算法 四&#xff1a;核函数&#xff08;1&#xff09;核函数的概述和作用&#xf…

车载应用生态:小程序容器技术成为保障安全的有力措施

随着智能交通和车联网技术的快速发展&#xff0c;越来越多的车载应用程序&#xff08;APP&#xff09;进入人们的视野&#xff0c;从而推动了车载业务生态的不断发展。然而&#xff0c;车载应用程序的安全问题也引起了人们的广泛关注。为此&#xff0c;小程序容器技术作为一种有…

4.24每日一练

题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcod…

毕业设计 医学图像阅读器 DICOM CT MRI 阅读器 三维重建 可视化编程技术及应用

一、 概述 此系统实现了常见 VTK 四视图&#xff0c;实现了很好的 DICOM 图像显示&#xff0c;可用于 DICOM 超声 X线 CT MR 三维重建 拾取像素值 窗宽 窗位 像素&#xff0c;距离测量&#xff0c;角度测量&#xff0c;提供源码&#xff1b; 并且通过三维重建实现可视化。使用…