React過渡動畫的具體使用
react-transition-group react-transition-group 是 React 官方維護(hù)的過渡動畫庫,專門用來給組件的掛載 / 卸載、顯示 / 隱藏添加過渡效果。
一、核心組件說明
react-transition-group 提供了 4 個核心組件,最常用的是 CSSTransition 和 TransitionGroup:
安裝
npm install react-transition-group
| 組件 | 用途 |
|---|---|
| Transition | 基礎(chǔ)組件,用 JS 控制過渡狀態(tài) |
| CSSTransition | 基于 CSS 類名的過渡(最常用) |
| TransitionGroup | 管理一組元素的過渡,配合 CSSTransition 實現(xiàn)列表動畫 |
| SwitchTransition | 控制兩個組件切換時的過渡 |
最常用:CSSTransition 示例(單元素過渡)
實現(xiàn)一個簡單的淡入淡出效果:
1. 組件代碼
import { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './fade.css';
function FadeDemo() {
const [show, setShow] = useState(false);
return (
<div>
<button onClick={() => setShow(!show)}>
{show ? '隱藏' : '顯示'}
</button>
{/* in: 控制是否顯示 timeout: 過渡持續(xù)時間(毫秒) classNames: 對應(yīng) CSS 類名前綴 unmountOnExit: 隱藏時卸載組件 */}
<CSSTransition
in={show}
timeout={300}
classNames="fade"
unmountOnExit >
<div className="box">我是淡入淡出的盒子</div>
</CSSTransition>
</div>
); }
export default FadeDemo;
2. 配套 CSS(fade.css)
CSSTransition 會自動給元素添加這些類名:
fade-enter:進(jìn)入前fade-enter-active:進(jìn)入中fade-enter-done:進(jìn)入完成fade-exit:離開前fade-exit-active:離開中fade-exit-done:離開完成
/* fade.css */
.box {
width: 200px;
height: 200px;
background: #409eff;
color: white;
display: flex;
align-items: center;
justify-content: center; margin-top: 20px;
}
/* 進(jìn)入前:透明度0,縮小 */
.fade-enter {
opacity: 0;
transform: scale(0.8);
}
/* 進(jìn)入中:過渡動畫 */
.fade-enter-active{
opacity: 1;
transform: scale(1);
transition: all 300ms
ease-in-out;
}
/* 離開前:保持當(dāng)前狀態(tài) */
.fade-exit {
opacity: 1;
transform: scale(1);
}
/* 離開中:過渡到隱藏狀態(tài) */
.fade-exit-active {
opacity: 0;
transform: scale(0.8);
transition: all 300ms ease-in-out; }進(jìn)階:TransitionGroup 實現(xiàn)列表動畫
實現(xiàn)一個列表添加 / 刪除時的動畫效果:
1. 組件代碼
import { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './list.css';
function ListDemo() {
const [items, setItems] = useState([
{ id: 1, text: '列表項1' },
{ id: 2, text: '列表項2' },
{ id: 3, text: '列表項3' }
]);
const addItem = () => {
const newId = Math.max(...items.map(i => i.id)) + 1;
setItems([...items, { id: newId, text: `列表項${newId}` }]); };
const removeItem = (id) => {
setItems(items.filter(item => item.id !== id));
};
return (
<div>
<button onClick={addItem}>添加列表項</button>
{/* TransitionGroup 包裹整個列表,管理所有子項的過渡 */}
<TransitionGroup className="list">
{items.map(item => (
<CSSTransition key={item.id}
timeout={300}
classNames="list-item"
>
<div className="list-item">
{item.text}
<button onClick={() => removeItem(item.id)}>刪除</button> </div> </CSSTransition> ))} </TransitionGroup>
</div> ); }
export default ListDemo;
- 配套 CSS(list.css)
/* list.css */
.list { margin-top: 20px; }
.list-item { display: flex; justify-content: space-between; align-items: center; padding: 10px; background: #f0f0f0; margin-bottom: 8px; border-radius: 4px; }
/* 進(jìn)入動畫:從下方滑入并淡入 */
.list-item-enter { opacity: 0; transform: translateY(20px); }
.list-item-enter-active { opacity: 1; transform: translateY(0); transition: all 300ms ease-out; }
/* 離開動畫:向上滑出并淡出 */
.list-item-exit { opacity: 1; transform: translateY(0); }
.list-item-exit-active { opacity: 0; transform: translateY(-20px); transition: all 300ms ease-in;
}常用屬性說明
CSSTransition 常用屬性
| 屬性 | 作用 |
|---|---|
| in | 控制組件是否顯示(true/false) |
| timeout | 過渡持續(xù)時間(毫秒),和 CSS 動畫時長保持一致 |
| classNames | CSS 類名前綴,比如 classNames="fade" 會生成 fade-enter 等類名 |
| unmountOnExit | 動畫結(jié)束后卸載組件(隱藏時不占空間) |
| appear | 組件首次掛載時也執(zhí)行進(jìn)入動畫 |
| onEnter / onEntered / onExit / onExited | 過渡階段的鉤子函數(shù) |
TransitionGroup 注意事項
- 子項必須設(shè)置唯一的 key,否則動畫會出錯
- 每個子項都要包裹 CSSTransition 才能觸發(fā)過渡
- 可以通過 component 屬性指定包裹的標(biāo)簽(默認(rèn)是 div)
到此這篇關(guān)于React過渡動畫的具體使用的文章就介紹到這了,更多相關(guān)React過渡動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react循環(huán)數(shù)據(jù)(列表)的實現(xiàn)
這篇文章主要介紹了react循環(huán)數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
React開發(fā)進(jìn)階redux saga使用原理詳解
這篇文章主要為大家介紹了React開發(fā)進(jìn)階redux saga使用原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
在React中用canvas對圖片標(biāo)注的實現(xiàn)
本文主要介紹了在React中用canvas對圖片標(biāo)注的實現(xiàn) ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
使用Axios在React中請求數(shù)據(jù)的方法詳解
這篇文章主要給大家介紹了初學(xué)React,如何規(guī)范的在react中請求數(shù)據(jù),主要介紹了使用axios進(jìn)行簡單的數(shù)據(jù)獲取,加入狀態(tài)變量,優(yōu)化交互體驗,自定義hook進(jìn)行數(shù)據(jù)獲取和使用useReducer改造請求,本文主要適合于剛接觸React的初學(xué)者以及不知道如何規(guī)范的在React中獲取數(shù)據(jù)的人2023-09-09
ReactNative錯誤采集原理在Android中實現(xiàn)詳解
這篇文章主要為大家介紹了ReactNative錯誤采集原理在Android中實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
React組件中使用JSON數(shù)據(jù)文件的方法詳解
要在 React 組件中使用 JSON 數(shù)據(jù),有多種方法,這篇文章主要為大家詳細(xì)介紹了五個常見的方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2024-01-01
React Fiber構(gòu)建beginWork源碼解析
這篇文章主要為大家介紹了React Fiber構(gòu)建beginWork源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

