1. 这些天也都在面试,面试的内容呢,也大多千篇一律,无外乎vue、react这些框架的一些原理,和使用方法。但是呢,有一家公司的CTO在国外,没办法对我的技术进行审核,所以他给我发了两套题,第一套题呢,是要使用react实现动画倒计时小时钟组件,父级组件通过传递秒、结束回调方法控制时钟组件。

2. 要求:

(1)倒计时组件调用 :

(2)倒计时组件内部简单结构 :

3. 思考实现过程:

(1)首先实现简单的数字倒计时更改

(2)最后实现数值更改结合transition运动

4. 具体核心代码实现:

(1)模板结构:

<div><section className="timeBox"><div className="timeBoxLineWrap"><div className="timeBoxLine" ref="timeBoxLine">{ this.state.remainingFormattedTime.split('').map((v,index,arr) => ((<div className="timeBoxLine-Box" key={index}  ><span className="timeBoxLine-Box-item">{this.state.lastTime[index]}</span><span className="timeBoxLine-Box-item">{v}</span></div>)) )}</div></div></section></div>

(2)生命周期以及执行方法:

import React from "react";import './time.css'export default class Countdown extends React.Component {constructor(props) {super(props);this.second = parseInt(this.props.remainingSecond);this.timer = null;this.state = { remainingFormattedTime: this.formatNumber(this.second-1), lastTime: this.formatNumber(this.second)};}componentDidMount() {//transfer timeTimerthis.timerTime();}//change timetimerTime = ()=>{this.timer = setInterval(()=>{this.compareTimeList();this.second--;if( this.second+2 === 0 ){this.listenTimeEnd();}},1000);}//Formatting a second to a time stringformatNumber = (seconds)=>{// max : 99:59:59let hour = 0;let minute = 0;let second = seconds<0 ? 0 : seconds;//If it is greater than one secondif(seconds > 59){second = seconds % 60;minute = Math.floor(seconds / 60);if( minute > 59 ){hour = Math.floor(minute / 60) > 99 ? 99 : Math.floor(minute / 60);minute = minute % 60;}}return (this.addZoom(hour)+':'+this.addZoom(minute)+':'+this.addZoom(second));}//add zoomaddZoom = (num)=>{if(num*1 > 9){return num;}else{return '0' + num;}}//time endlistenTimeEnd = ()=>{clearInterval(this.timer);this.initTimeBox();this.setState({ remainingFormattedTime: '00:00:00', lastTime: '00:00:00'});this.props.onComplete&&this.props.onComplete();}initTimeBox(){let TimeBoxItems = this.refs.timeBoxLine.children;for(var i=0;iTimeBoxItems[i].style.cssText = "transition:0s ease;transform:translateY(0);";}}//compare timecompareTimeList = ()=>{let otime = this.state.lastTime;let ctime = this.state.remainingFormattedTime;let TimeBoxItems = this.refs.timeBoxLine.children;let This = this;//clear transformfor(var i=0;iTimeBoxItems[i].index = i;TimeBoxItems[i].addEventListener('transitionend',function(){This.setState( {remainingFormattedTime: This.formatNumber(This.second) , lastTime: This.formatNumber(This.second+1) } );this.style.cssText = 'transition:0s ease;transform:translateY(0)';});}// set animationfor(var i=0;iif(otime[i] != ctime[i]){TimeBoxItems[i].style.cssText = "transition:ease 0.5s;transform:translateY(-100%);"}else{TimeBoxItems[i].style.cssText = "transition:0s ease;transform:translateY(0);";}}}// render render() {return (//模板结构);} }

5. 最需要注意的就是,数据驱动后动画的更改,或者DOM更新后,动画的衔接。

6. 组件开发结束,最终预览效果:

子在川上曰,逝者如斯夫 ~

react实现动画电子倒计时组件相关推荐

  1. react native 动画组件(Animated)浅析

    简述 react native封装了两个易于使用的动画组件.用于全局的布局动画LayoutAnimation,和用于创建更精细的交互控制的动画Animated.本章主要对Animated组件进行简单的 ...

  2. [React Native] 动画 · Animated

    [React Native] 动画 · Animated 如果要在一个 React Native 应用中添加动画效果,首先考虑的就是官方提供的 Animated .通过定义输入和输出的动画状态值,调用 ...

  3. React Native 动画(Animated)笔记

    学习笔记--方便下次查看 大多数情况下,在 React Native 中创建动画是推荐使用 Animated API 的,其提供了三个主要的方法用于创建动画: 1.API Animated.timin ...

  4. React Native动画入门全解析

    动画 React Native 提供了两个互补的动画系统: 用于创建精细的交互控制动画Animated 用于全局的布局动画LayoutAnimation Animated Animated通过 **. ...

  5. 【Flutter】Animation 动画 ( AnimatedBuilder 动画使用流程 | 创建动画控制器 | 创建动画 | 创建动画作用的组件 | 关联动画与组件 | 动画执行 )

    文章目录 ◯.AnimatedBuilder 引入 一.创建动画控制器 二.创建动画 三.创建动画作用的组件 四.创建 AnimatedBuilder 关联动画与组件 五.动画运行 六.完整代码示例 ...

  6. React Native 项目常用第三方组件汇总

    React Native 项目常用第三方组件汇总 https://www.jianshu.com/p/d9cd9a868764?utm_campaign=maleskine&utm_conte ...

  7. react循环setstate_react -- 关于兄弟组件触发更新的问题

    大家在用react的时候,应该都知道react的state更新会由父到子逐级更新的事情,那么就会有这样一个问题,当要渲染的页面元素较多,极端情况下,特别是大数据展示的时候,由顶层一点点逐级渲染,性能消 ...

  8. vue 倒计时 插件_vue中实现倒计时组件与毫秒效果

    时分秒倒计时组件 template {{ getHours1 }} {{ getHours2 }} : {{ getMinutes1 }} {{ getMinutes2 }} : {{ getSeco ...

  9. vue 滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll

    前几天有给大家分享一个Vue自定义滚动条组件VScroll.今天再分享一个最新开发的React PC端模拟滚动条组件RScroll. vue+pc桌面端模拟滚动条组件VScroll rscroll 一 ...

  10. react封装函数_GitHub - daifee/react-component: 用 React 封装一套常用组件

    Daifee-React-Component 用 React 封装一套常用组件 所有组件都是 stateless 组件,但为方便,某些组件提供 API 调用方式的静态方法. [TOC] 使用前须知 源 ...

最新文章

  1. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
  2. 仅用 480 块 GPU 跑出万亿参数!全球首个“低碳版”巨模型 M6 来了
  3. mongo java client_mongodb java客户端的使用,即MongoClient
  4. CTFshow 命令执行 web34
  5. python打印倒等腰梯形,Linux使用shell脚本做的菱形等一些益智题
  6. 逆向工程核心原理学习笔记(十三):分析abex' crackme #1 的延伸:将参数压入栈
  7. 电销机器人价格_箭鱼电销机器人:为什么电话机器人公司不用机器人给你打电话?...
  8. 在WildFly和OpenShift上的WebSocket聊天
  9. 玩! 框架+ Google Guice
  10. Centos7下安装Python3.5
  11. java中JFrame.setSize,Java JFrame .setSize(x, y) not working?
  12. ubuntu 11.10英文界面下中文字体显示楷体的问题
  13. 人大金仓助力广东融合创新智慧校园建设与网络安全交流会成功举办
  14. wps指定路径不存在怎么办_WPS说目录不存在
  15. 经典的开源免费网络游戏:planeshift
  16. C++——VS2019调整字体和主题
  17. c++语言如何实现水仙花数(小白)
  18. graphpad柱状图怎么加图例_科研绘图教程| 如何用Graphpad Prism绘制超复杂组合图?...
  19. 金融行业 | 电子银行系统性能优化解决方案 1
  20. “希希敬敬对”团队作业——敏捷冲刺6

热门文章

  1. MySQL 重置密码
  2. 向日葵远程控制软件linux版安装
  3. Class ZipArchive not found,安装zip扩展
  4. vcpkg如何全面卸载和重新安装包
  5. 已经被废弃的 tcp_tw_recycle
  6. 基于贝叶斯网络模型的自适应测评
  7. 服务器采集协议,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)
  8. iOS开发:报错The sandbox is not in sync with the Podfile.lock. Run ‘pod install‘ …的解决方法
  9. win10 原版无捆绑系统下载
  10. coreldraw怎么打印荣誉证书_教你如何打印大于A4尺寸的荣誉证书和奖状