React實(shí)現(xiàn)過渡效果更新時(shí)間展示功能
創(chuàng)建一個(gè)組件,實(shí)時(shí)展示時(shí)分秒,并且動(dòng)態(tài)更新數(shù)據(jù)。
數(shù)據(jù)變化時(shí)利用過渡效果動(dòng)態(tài)更新。
利用兩個(gè)元素,重疊在一個(gè)位置,以達(dá)到交替變化的效果
//創(chuàng)建秒顯示節(jié)點(diǎn) <div className="text second"> <CSSTransition in="{renderSecond}" timeout="{1000}" classNames="fade" unmountOnExit="{!renderSecond}" > {() => <div className="fade">{secondeA}</div> } </CSSTransition> <CSSTransition in="{!renderSecond}" timeout="{1000}" classNames="fade" unmountOnExit="{renderSecond}" > {() => <div className="fade">{secondeB}</div> } </CSSTransition> </div>
利用官方提供的過渡動(dòng)畫庫react-transition-group
文檔地址https://reactcommunity.org/react-transition-group/https://reactcommunity.org/react-transition-group/
使用了CSSTransition組件構(gòu)建過渡動(dòng)畫
- in<boolean>:用來觸發(fā)元素enter或exit
- timeout<number>:實(shí)現(xiàn)過渡的時(shí)間,ms
classNames<string>:注意是Names,不是Name。組件會(huì)依據(jù)提供的類名,進(jìn)行過渡類名的拼接。(classNames='fade'->className='fade fade-enter fade-enter-active')
- unmountOnExit<boolean>:動(dòng)畫結(jié)束后是否刪除節(jié)點(diǎn)
<CSSTransition in={renderMinute} timeout={1000} classNames="fade" unmountOnExit={!renderMinute} > {() => <div className="fade">{minuteA}</div>} </CSSTransition>
//將兩個(gè)元素重疊在一個(gè)位置 //對(duì)類fade-enter,fade-enter-active,fade-exit,fade-exit-active進(jìn)行動(dòng)畫編寫 .text { position: relative; width: 25px; display: flex; justify-content: center; align-items: center; .fade { position: absolute; &-enter { transform: translateY(-20px); opacity: 0; &-active { transform: translateY(0); opacity: 1; transition: all 0.8s ease-out; } } &-exit { transform: translateY(0); opacity: 0.5; &-active { transform: translateY(20px); opacity: 0; transition: all 0.6s ease-in; } } } }
在組件掛載結(jié)束后開啟定時(shí)器,對(duì)時(shí)間進(jìn)行更新
//定義兩個(gè)響應(yīng)式變量作為秒元素的兩個(gè)節(jié)點(diǎn) //定義記錄當(dāng)前渲染標(biāo)記,用來記錄顯示哪一個(gè)元素 //掛載后開啟定時(shí)器,每一秒都會(huì)進(jìn)行數(shù)據(jù)更新,根據(jù)渲染標(biāo)記,更新不同的響應(yīng)式變量,起到新時(shí)間替換舊時(shí)間的動(dòng)畫效果 const AnimatedText = () => { const [secondeA, setSecondeA] = useState<string>(dayjs().format('ss')) const [secondeB, setSecondeB] = useState<string>(dayjs().format('ss')) const [renderSecond, setRenderSecond] = useState<boolean>(true) const renderSecondRef = useRef<boolean>(true) useEffect(() => { const interval = setInterval(() => { if (!renderSecondRef.current) { setSecondeA(dayjs().format('ss')) } else { setSecondeB(dayjs().format('ss')) } setRenderSecond(a => { renderSecondRef.current = !a return !a }) }, 1000) return () => clearInterval(interval) }, []) }
import { useState, useEffect, useRef } from 'react' import { CSSTransition } from 'react-transition-group' import './test.less' import dayjs from 'dayjs' const AnimatedText = () => { const [secondeA, setSecondeA] = useState<string>(dayjs().format('ss')) const [secondeB, setSecondeB] = useState<string>(dayjs().format('ss')) const [renderSecond, setRenderSecond] = useState<boolean>(true) const renderSecondRef = useRef<boolean>(true) const [minuteA, setMinuteA] = useState<string>(dayjs().format('mm')) const [minuteB, setMinuteB] = useState<string>(dayjs().format('mm')) const [renderMinute, setRenderMinute] = useState<boolean>(true) const renderMinuteRef = useRef<boolean>(true) const [hourA, setHourA] = useState<string>(dayjs().format('HH')) const [hourB, setHourB] = useState<string>(dayjs().format('HH')) const [renderHour, setRenderHour] = useState<boolean>(true) const renderHourRef = useRef<boolean>(true) useEffect(() => { const interval = setInterval(() => { if (!renderSecondRef.current) { setSecondeA(dayjs().format('ss')) } else { setSecondeB(dayjs().format('ss')) } setRenderSecond(a => { renderSecondRef.current = !a return !a }) }, 1000) return () => clearInterval(interval) }, []) useEffect(() => { const interval = setInterval(() => { if (dayjs().format('ss') !== '00') return if (!renderMinuteRef.current) { setMinuteA(dayjs().format('mm')) } else { setMinuteB(dayjs().format('mm')) } setRenderMinute(a => { renderMinuteRef.current = !a return !a }) }, 1000) return () => clearInterval(interval) }, []) useEffect(() => { const interval = setInterval(() => { if (dayjs().format('mm') !== '00') return if (!renderHourRef.current) { setHourA(dayjs().format('HH')) } else { setHourB(dayjs().format('HH')) } setRenderHour(a => { renderHourRef.current = !a return !a }) }, 1000) return () => clearInterval(interval) }, []) return ( <> <div className="area"> <div className="text hour"> <CSSTransition in={renderHour} timeout={1000} classNames="fade" unmountOnExit={!renderHour} > {() => <div className="fade">{hourA}</div>} </CSSTransition> <CSSTransition in={!renderHour} timeout={1000} classNames="fade" unmountOnExit={renderHour} > {() => <div className="fade">{hourB}</div>} </CSSTransition> </div> <div className="text">:</div> <div className="text minute"> <CSSTransition in={renderMinute} timeout={1000} classNames="fade" unmountOnExit={!renderMinute} > {() => <div className="fade">{minuteA}</div>} </CSSTransition> <CSSTransition in={!renderMinute} timeout={1000} classNames="fade" unmountOnExit={renderMinute} > {() => <div className="fade">{minuteB}</div>} </CSSTransition> </div> <div className="text">:</div> <div className="text second"> <CSSTransition in={renderSecond} timeout={1000} classNames="fade" unmountOnExit={!renderSecond} > {() => <div className="fade">{secondeA}</div>} </CSSTransition> <CSSTransition in={!renderSecond} timeout={1000} classNames="fade" unmountOnExit={renderSecond} > {() => <div className="fade">{secondeB}</div>} </CSSTransition> </div> </div> </> ) } export default AnimatedText
.area { display: flex; justify-content: center; align-items: center; width: 100%; .text { position: relative; width: 25px; display: flex; justify-content: center; align-items: center; .fade { position: absolute; &-enter { transform: translateY(-20px); opacity: 0; &-active { transform: translateY(0); opacity: 1; transition: all 0.8s ease-out; } } &-exit { transform: translateY(0); opacity: 0.5; &-active { transform: translateY(20px); opacity: 0; transition: all 0.6s ease-in; } } } } }
到此這篇關(guān)于React實(shí)現(xiàn)過渡效果更新時(shí)間展示功能的文章就介紹到這了,更多相關(guān)React過渡效果內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決webpack -p壓縮打包react報(bào)語法錯(cuò)誤的方法
這篇文章主要給大家介紹了關(guān)于解決webpack -p壓縮打包react報(bào)語法錯(cuò)誤的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-07-07react.js使用webpack搭配環(huán)境的入門教程
本文主要介紹了react 使用webpack搭配環(huán)境的入門教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-08-08使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享
在復(fù)雜的React應(yīng)用中,組件之間的數(shù)據(jù)共享是必不可少的,為了解決這個(gè)問題,可以使用React?Redux來管理應(yīng)用的狀態(tài),并實(shí)現(xiàn)組件之間的數(shù)據(jù)共享,在本文中,我們將介紹如何使用React?Redux實(shí)現(xiàn)Count和Person組件之間的數(shù)據(jù)共享,需要的朋友可以參考下2024-03-03React+TypeScript+webpack4多入口配置詳解
這篇文章主要介紹了React+TypeScript+webpack4多入口配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟(附源碼)
本文主要介紹了從零搭建Webpack5-react腳手架的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08react開發(fā)中如何使用require.ensure加載es6風(fēng)格的組件
本篇文章主要介紹了react開發(fā)中如何使用require.ensure加載es6風(fēng)格的組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05