Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解

在 Vue 开发过程中,为应用添加过渡效果和处理响应式数据是提升用户体验和实现动态交互的关键。

一、transition:元素的单元素过渡效果

transition是 Vue 提供的内置组件,专门用于为单个元素或组件添加过渡动画。它会在元素插入、更新或移除 DOM 时自动应用相应的 CSS 类名,配合 CSS 动画或过渡属性,实现平滑的视觉效果。

1. 基本使用

使用transition组件包裹需要添加过渡效果的元素,同时指定name属性,这个属性值将作为 CSS 类名的前缀。示例代码如下:

<template><div><button @click="show =!show">Toggle Element</button><transition name="fade"><p v-if="show">This is a paragraph with transition effect.</p></transition></div>
</template><script>
export default {data() {return {show: false};}
};
</script><style>
.fade-enter-active,
.fade-leave-active {transition: opacity 1s;
}
.fade-enter-from,
.fade-leave-to {opacity: 0;
}
</style>

在上述代码中,当点击按钮时,<p>元素会根据show的值进行显示或隐藏。transition组件会在元素插入(显示)和移除(隐藏)时,分别添加对应的 CSS 类名:

  • fade-enter-from:进入过渡的起始状态。
  • fade-enter-active:进入过渡的活跃状态,应用过渡动画。
  • fade-enter-to:进入过渡的结束状态。
  • fade-leave-from:离开过渡的起始状态。
  • fade-leave-active:离开过渡的活跃状态,应用过渡动画。
  • fade-leave-to:离开过渡的结束状态。

transition过渡效果

2. 过渡模式

transition还支持mode属性,用于指定过渡模式,解决元素切换时可能出现的闪烁问题。常见的过渡模式有:

  • in-out:新元素先进行进入过渡,完成后当前元素进行离开过渡。
  • out-in:当前元素先进行离开过渡,完成后新元素进行进入过渡。
<transition name="slide" mode="out-in"><div v-if="show">{{ message }}</div>
</transition>

二、transition-group:多个元素的过渡效果

当需要对多个元素或组件同时添加过渡效果时,transition-group就派上用场了。它与transition的主要区别在于,transition-group需要为每个子元素指定唯一的key属性,并且它会以真实的 DOM 元素形式渲染,而不是像transition那样作为一个不可见的包裹元素。

1. 基本使用

以下是一个简单的列表项添加和移除过渡效果的示例:

<template><div><button @click="addItem">Add Item</button><transition-group name="slide" tag="ul"><li v-for="(item, index) in items" :key="index">{{ item }}</li></transition-group></div>
</template><script>
export default {data() {return {items: []};},methods: {addItem() {this.items.push(`Item ${this.items.length + 1}`);}}
};
</script><style>
.slide-enter-active,
.slide-leave-active {transition: all 0.5s;
}
.slide-enter-from,
.slide-leave-to {transform: translateX(100%);opacity: 0;
}
</style>

在这个例子中,每次点击按钮,新的列表项会以滑动的方式进入页面,而移除列表项时也会有相应的滑动离开效果。tag属性指定了transition-group最终渲染成的 HTML 标签,这里设置为<ul>

transitionGroup过渡效果

2. 排序过渡

transition-group还可以实现列表项排序时的过渡效果。当列表项顺序发生变化时,通过监听数据变化,结合sort方法和过渡动画,让排序过程更加流畅。

<template><div><button @click="sortItems">Sort Items</button><!-- transition-group用于多个元素的过渡效果 --><!-- name="scale"指定过渡类名前缀,tag="ul"指定渲染为ul元素 --><transition-group name="scale" tag="ul"><!-- 使用对象的唯一ID作为key,确保Vue能正确跟踪元素身份变化 --><!-- 当元素身份明确时,Vue才能正确应用进入/离开过渡 --><li v-for="item in sortedItems" :key="item.id">{{ item.value }}</li></transition-group></div>
</template><script>
export default {data() {return {// 使用对象数组,每个对象包含唯一ID和显示值// 避免使用数组索引作为key,防止Vue复用相同位置的元素items: [{ id: 1, value: 'Apple' },{ id: 2, value: 'Banana' },{ id: 3, value: 'Cherry' },{ id: 4, value: 'Date' }],// 排序方向控制,用于确保每次点击都有实际排序变化sortOrder: 'asc'};},computed: {sortedItems() {// 创建数组副本以触发响应式更新// 使用localeCompare确保字符串按字母顺序排序return [...this.items].sort((a, b) => {if (this.sortOrder === 'asc') {return a.value.localeCompare(b.value); // 升序排序} else {return b.value.localeCompare(a.value); // 降序排序}});}},methods: {async sortItems() {// 切换排序方向,确保每次点击都有实际排序变化this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc';// 等待DOM更新完成// 确保上一次的排序操作已完全反映在DOM中await this.$nextTick();// 通过添加随机延迟属性强制Vue重新渲染元素// 这触发了Vue的过渡系统,因为每个元素的属性发生了变化this.items = this.sortedItems.map(item => ({...item,delay: Math.random() * 0.2 // 随机延迟0-200ms}));// 注意:这里的delay属性不需要在视图中使用// 它仅用于触发Vue的响应式系统和过渡效果}}
};
</script><style>
.scale-enter-active,
.scale-leave-active,
.scale-move {transition: all 0.5s;position: relative; /* 确保定位正确,防止过渡期间元素重叠 */
}
.scale-enter-from,
.scale-leave-to {transform: scale(0);opacity: 0;
}
</style>  

在上述代码中,点击排序按钮后,列表项在重新排序时会有缩放的过渡效果,scale-move类名用于处理元素移动时的过渡动画。

transitionGroup排序过渡效果

三、reactive:创建响应式对象

reactive是 Vue 3 中用于创建响应式数据的函数。它接收一个普通对象作为参数,并返回一个响应式的代理对象。任何对代理对象属性的修改都会触发视图的更新。

1. 基本使用

<template><div><p>Count: {{ state.count }}</p><button @click="increment">Increment</button></div>
</template><script>
import { reactive } from 'vue';export default {setup() {const state = reactive({count: 0});const increment = () => {state.count++;};return {state,increment};}
};
</script>

setup函数中,使用reactive创建了一个包含count属性的响应式对象state。当点击按钮调用increment方法时,state.count的值增加,视图会自动更新显示最新的计数。

2. 嵌套对象与数组

reactive同样适用于嵌套的对象和数组。对嵌套属性的修改也会保持响应式。

<template><div><p>Name: {{ user.name }}</p><p>Age: {{ user.age }}</p><button @click="updateUser">Update User</button></div>
</template><script>
import { reactive } from 'vue';export default {setup() {const user = reactive({name: 'Alice',age: 25,address: {city: 'New York',street: '123 Main St'},hobbies: ['Reading', 'Music']});const updateUser = () => {user.name = 'Bob';user.age = 30;user.address.city = 'Los Angeles';user.hobbies.push('Traveling');};return {user,updateUser};}
};
</script>

在这个示例中,user是一个包含嵌套对象和数组的响应式对象。调用updateUser方法修改属性时,相关的视图内容都会及时更新。

四、ref:创建响应式引用

ref是 Vue 3 中另一个重要的响应式 API,它可以用来创建一个包含任意类型值的响应式引用。与reactive不同,ref不仅适用于对象,还适用于基本数据类型(如字符串、数字、布尔值等)。

1. 基本使用

<template><div><p>Message: {{ message }}</p><button @click="changeMessage">Change Message</button></div></template><script>import { ref } from 'vue';export default {setup() {const message = ref('Hello, Vue!');const changeMessage = () => {message.value = 'Goodbye, Vue!';};return {message,changeMessage};}};</script>

在上述代码中,使用ref创建了一个包含字符串的响应式引用message。在模板中通过message显示其值,点击按钮时修改message.value,视图会随之更新。

2. 访问 DOM 元素

ref还常用于获取 DOM 元素的引用。通过在模板元素上设置ref属性,并在setup函数中使用同名的ref,可以获取到对应的 DOM 元素。

<template><div><input type="text" ref="inputElement" /><button @click="focusInput">Focus Input</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const inputElement = ref(null);const focusInput = () => {if (inputElement.value) {inputElement.value.focus();}};return {inputElement,focusInput};}
};
</script>

在上述代码中,通过ref获取到<input>元素的引用,点击按钮时调用focusInput方法,将焦点设置到输入框上。

在实际项目开发中,合理运用这些特性,可以为应用增添丰富的交互效果和高效的数据管理能力,提升用户体验。

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

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

相关文章

文章七《深度学习调优与超参数优化》

&#x1f680; 文章7&#xff1a;深度学习调优与超参数优化——你的AI模型需要一场"整容手术" 一、模型调优核心策略&#xff1a;像调整游戏装备一样优化模型 1. 学习率调整&#xff1a;掌控训练的"油门踏板" 比喻&#xff1a;把模型训练想象成赛车游戏&…

Python装饰器执行时机详解:模块加载时的魔法

装饰器执行的基本原理 Python装饰器在程序运行过程中遵循独特的执行逻辑&#xff0c;其核心特性体现在模块加载阶段的即时执行。通过示例7-2的registration.py 模块&#xff0c;我们可以清晰观察到装饰器与函数执行的时序差异。 registry []def register(func):print(runnin…

基于随机森林的糖尿病预测模型研究应用(python)

基于随机森林的糖尿病预测模型研究应用 1、导入糖尿病数据集 In [14]: import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt datapd.read_csv(./糖尿病数据集.csv,encoding"gbk") data.head()#查看前五行数据Out[14]:…

【Web应用服务器_Tomcat】二、Tomcat 核心配置与集群搭建

在企业级 Java Web 应用的部署场景中&#xff0c;Tomcat 作为主流的 Servlet 容器和 Web 服务器&#xff0c;其核心配置的优化以及集群搭建对于保障应用的高性能、高可用性至关重要。 一、Tomcat 核心配置优化​ 1.1 server.xml 配置文件解析​ Tomcat 的核心配置文件server…

Linux(文件管理)

文件命名规则 除了字符“/”之外&#xff0c;所以的字符都可以使用&#xff0c;但要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;如&#xff1a;<、>、?、*等 如果一个文件名中包含了特殊字符&#xff0c;例如空格&#xff0c;那…

Windows服务器部署全攻略:Flask+Vue+MySQL跨平台项目实战(pymysql版)

当你的后端(Flask+pymysql,Windows开发)与前端(Vue,Mac开发)需要统一部署到Windows服务器时,通过「IIS反向代理+原生组件适配」方案可实现稳定交互。以下是针对Windows环境的专属部署指南,解决路径适配、服务启动等核心问题。 一、Windows服务器环境准备(必做!) 1…

wpf 输入框 在输入时去除水印

wpf ScrollViewer 在输入数据时去除水印 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入&#xff08;例如文本输入&#xff09;&#xff0c;并且希望在输入时去除水…

动态思维——AI与思维模型【91】

一、定义 动态思维思维模型是一种强调在思考问题和分析情况时&#xff0c;充分考虑到事物的变化性、发展性和相互关联性&#xff0c;不局限于静态的、孤立的视角&#xff0c;而是以发展变化的眼光看待事物&#xff0c;能够根据不同时间、环境和条件的变化&#xff0c;灵活调整…

多模态大语言模型arxiv论文略读(五十五)

MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文标题&#xff1a;MoMA: Multimodal LLM Adapter for Fast Personalized Image Generation ➡️ 论文作者&#xff1a;Kunpeng Song, Yizhe Zhu, Bingchen Liu, Qing Yan, Ahmed Elgammal, Xiao…

Go-web开发之帖子功能

帖子功能 route.go r.Use(middleware.JWTAuthMiddleware()){r.POST("/post", controller.CreatePostHandler)r.GET("/post/:id", controller.GetPostDetailHandler)}post.go 定义帖子结构 type Post struct {Id int64 json:"id" …

C++ 项目中的多语言字符串管理方案(支持自动提示与动态加载)

&#x1f4ac; C 项目中的多语言字符串管理方案&#xff08;支持自动提示与动态加载&#xff09; 在中大型 C 应用中&#xff0c;我们常常会面临界面提示文本繁多、需要支持多语言切换的问题。为了解决字符串管理混乱、缺乏自动提示、难以维护等问题&#xff0c;本文将提供一种…

数控滑台:将制造业推向智能化的关键装备

随着制造业的不断发展和智能化进程的加速推进&#xff0c;数控滑台作为一种关键的装备&#xff0c;在各种工业生产中发挥着越来越重要的作用。数控滑台不仅提高了生产效率&#xff0c;节约了人力物力资源&#xff0c;还大大降低了生产过程中的错误率&#xff0c;保障了产品的质…

【STM32】定时器输入捕获

STM32 定时器输入捕获功能笔记 一、什么是输入捕获&#xff08;Input Capture&#xff09; 输入捕获是利用定时器的输入通道&#xff0c;在检测到信号电平变化&#xff08;如上升沿或下降沿&#xff09;时&#xff0c;立即将当前计数器的值捕获并保存到捕获寄存器&#xff08…

Qt通过QXlsx库文件写入到excl文件,读取excl文件

第一&#xff1a;下载QXlsx库文件 https://download.csdn.net/download/qq_32663053/90739425 第二&#xff1a;在Qt项目中引入QXlsx库&#xff0c;需要把QXlsx库文件放在项目文件夹下 第三&#xff1a;将tableview中的数据存入到excl文件 代码&#xff1a; void MainWindow…

【KWDB 创作者计划】一款面向 AIoT 的多模数据库实战体验

一、KWDB&#xff1a;AIoT 时代的数据库新选择 KWDB 是由开放原子开源基金会孵化的分布式多模数据库&#xff0c;专为物联网、工业互联网等场景设计。其核心价值在于时序与关系数据融合处理能力&#xff1a; ​多模统一引擎​&#xff1a;单个实例可同时建立时序库&#xff08…

【教学类-102-22】蝴蝶彩色1——通义万相“彩色蝴蝶”透明切边基础图片制作(五款板式、批量下载、修图、透明、切边)

一、下载图片 关键词&#xff1a;卡通简笔画&#xff0c;白色背景&#xff0c;黑白轮廓线&#xff0c;、鲜艳&#xff0c;彩色&#xff0c;一只蝴蝶&#xff0c;简单&#xff0c;可爱&#xff0c;矢量图&#xff0c;大。 简笔画 强度1 4:3(长方形适配A4纸&#xff09; 五…

【JAVA】方法定义与重载:JVM方法调用机制(8)

核心知识点详细解释 Java方法的定义和使用 在Java中&#xff0c;方法是一段具有特定功能的代码块&#xff0c;它可以接受参数并返回一个值。方法的定义包括方法的修饰符、返回类型、方法名、参数列表和方法体。其基本语法如下&#xff1a; 修饰符 返回类型 方法名(参数列表)…

基于STM32的带恒温系统智能外卖柜设计

标题:基于STM32的带恒温系统智能外卖柜设计 内容:1.摘要 随着外卖行业的迅速发展&#xff0c;对外卖存放设备的智能化和功能性要求日益提高。本设计的目的是开发一种基于STM32的带恒温系统智能外卖柜。方法上&#xff0c;以STM32微控制器为核心&#xff0c;结合温度传感器、加…

【综述】相位解包裹算法对比分析

引言 相位解包裹是基于干涉的位相测量技术中的重要环节&#xff0c;如合成孔径雷达干涉、光学干涉测量技术、医学成像技术、数字全息三维成像、相干衍射成像等技术中都涉及位相解包裹。位相解包裹也称为位相展开、位相解截断、位相解缠绕等。与之相反的过程谓之包裹位相、截断…

Rust 学习笔记:关于枚举与模式匹配的练习题

Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题 Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题以下程序能否通过编译&#xff1f;若能&#xff0c;输出是什么&#xff1f;考虑这两种表示结果类型的方式&#xff0c;若计算成功&#xff0c;则包含值 T&#xff1b…