首页 > 其他分享 >React实现过渡效果更新时间展示

React实现过渡效果更新时间展示

时间:2024-07-29 09:21:20浏览次数:12  
标签:const fade dayjs format 展示 React useState 过渡 return

 

创建一个组件,实时展示时分秒,并且动态更新数据。

数据变化时利用过渡效果动态更新。

利用两个元素,重叠在一个位置,以达到交替变化的效果

//创建秒显示节点
<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>

 

利用官方提供的过渡动画库react-transition-group

文档地址https://reactcommunity.org/react-transition-group/https://reactcommunity.org/react-transition-group/

使用了CSSTransition组件构建过渡动画

  • in<boolean>:用来触发元素enter或exit
  • timeout<number>:实现过渡的时间,ms
  •  classNames<string>:注意是Names,不是Name。组件会依据提供的类名,进行过渡类名的拼接。(classNames='fade'->className='fade fade-enter fade-enter-active')
  • unmountOnExit<boolean>:动画结束后是否删除节点
<CSSTransition
    in={renderMinute}
    timeout={1000}
    classNames="fade"
    unmountOnExit={!renderMinute}
>
    {() => <div className="fade">{minuteA}</div>}
</CSSTransition>
//将两个元素重叠在一个位置
//对类fade-enter,fade-enter-active,fade-exit,fade-exit-active进行动画编写
.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;
			}
		}
	}
}

 在组件挂载结束后开启定时器,对时间进行更新

//定义两个响应式变量作为秒元素的两个节点
//定义记录当前渲染标记,用来记录显示哪一个元素
//挂载后开启定时器,每一秒都会进行数据更新,根据渲染标记,更新不同的响应式变量,起到新时间替换旧时间的动画效果
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;
				}
			}
		}
	}
}

 

标签:const,fade,dayjs,format,展示,React,useState,过渡,return
From: https://www.cnblogs.com/karle/p/18325906

相关文章

  • mapbox大数据展示
    Mapbox是一个强大的地图引擎,可以用来展示大数据。以下是使用Mapbox展示大数据的基本步骤和示例代码:注册Mapbox账号并获取访问令牌(AccessToken)。在HTML中引入MapboxGLJS库。初始化地图并设置样式。使用GeoJSON或者其他格式加载数据。根据加载的数据添......
  • SQL Server数据库升级与迁移:平稳过渡的艺术
    SQLServer数据库升级与迁移:平稳过渡的艺术在数据库的生命周期中,升级和迁移是不可避免的操作。无论是升级到SQLServer的新版本,还是迁移到新的服务器或云环境,都需要谨慎处理以确保数据的完整性和业务的连续性。本文将详细介绍SQLServer数据库版本升级和迁移的注意事项,并提......
  • Django-React 应用程序中的静态文件未在生产环境中加载
    我正在Docker容器中运行Django应用程序,但在生产中提供静态文件时遇到问题。本地一切工作正常,但是当我部署到生产环境时,静态文件不会加载,并且出现404错误。以下是我的设置的相关部分:Djangosettings.py:TEMPLATES=[{'BACKEND':......
  • vscode-react-javascript-snippets
    SnippetsSnippetsinfoEveryspaceinside {} and () meansthatthisispushedintonextline:) $ representeachstepafter tab.TypeScript hasowncomponentsandownsnippets.Usesearchorjusttype ts beforeeverycomponentsnippet.I.E. t......
  • 使用vite创建react项目并进行初始化(仓库、路由、封装)
    前言学的时候都是跟着教程进行创建,后面发现自己写项目的时候记不住需要做什么,所以现在写一篇来给自己总结一下。(后面忘了也不用翻视频了,直接照着抄答案)只写流程,没有理论。这是我写的习惯,只具备一定通用性,有需要可参考。创建项目npmcreatevite@latestHireSpherenpmins......
  • 从输入 URL 到页面展示到底发生了什么?
    在浏览器输入网址后,浏览器会先解析URL,解析出域名、资源路径、端口等信息,准备发送HTTP请求,检查浏览器缓存是否有缓存该资源,如果有就直接返回;没有的话就进入下一步网路请求;接着进行DNS域名解析,来获取请求域名的IP地址,如果请求协议是HTTPS,那么还会需要建立TLS连接,DNS......
  • 构建一个具有深色模式的简单React Web应用
    在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。项目概述我们的目标是创建一个具有以下特性的Web应用:左侧导航栏,包含四个......
  • 【一手源码展示】Java代码TikTok内嵌商城代码程序,TikTok跨境电商系统源码,TK商城源码
    这套程序已经做了很久了我这边修复二开优化也好几个版本搭建起来做起来确实费劲前后端分离的程序 二开效果页面展示:......
  • 颜色选择器react-color
    配合表单使用的颜色选择器:https://www.jianshu.com/p/b7bc59146058,原文reacthooks版本的,我改成的class函数版本的。  1.安装:npminstallreact-color--save  2.封装:colorPicker.js importReact,{FC}from'react';import{SketchPicker}from'react-color'......
  • NVIDIA 初创加速计划 | 2024 NVIDIA 创业企业展示报名开启
    我们正处于一场新的工业革命之中。人工智能技术即将广泛渗透到各个行业,并推动生产力提高至前所未有的水平。而技术进步绝不仅仅是这场革命的唯一驱动力,新工业革命的到来更依赖于众多敢于创新、勇于探索的科技创业企业,他们在这场革命中扮演着至关重要的角色,并能够迅速将最新的科研......