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.pswp.cn/pingmian/79172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79172.shtml
英文地址,請注明出處:http://en.pswp.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…