序
看了好几天react的文档, 也还是要写一点dome才能很好的掌握这些技能, 想想就随便写一个倒计时吧, 而且TypeScript与React完全是天生一对, 也可以一起练习一下
创建项目 && 添加 TypeScript
如果直接新建项目的话可以直接运行下面命令就行
1 | npx create-react-app my-app --typescript |
不过我是以前创建的项目添加TS
首先安装依赖
1 | npm install --save typescript @types/node @types/react @types/react-dom @types/jest |
创建tsconfig配置文件
1 | touch tsconfig.json |
1 | { |
然后将jsx文件改为tsx就可以了
项目开始
创建App.tsx
文件, 然后直接再index.tsx
文件中引入挂载到页面上
模块拆分
正所谓磨刀不误砍柴工, 我们提出一个想法首先是需要对这个项目进行仔细的分析, 然后拆分功能模块, 然后对系统详细进行设计. 而不是直接开始敲代码, 然后一会儿就不知道做到哪儿了, 接下来应该怎么办
首先这个倒计时的小Dome呢, 我想做成那种动画形式的, 数字是一个一个的滚动下来, 然后日时分秒
分开显示, 最后倒计时走完之后它开始正计时
根据我的需求来分析, 我大致把功能分成三个组件:
每一个数字都要做滚动动画, 所以每一个数字都是一个NumRoll组件
(可以参考前面我的文章滚动的数字栏)
然后时分秒应该都是最大不超过两位的整数, 只是单位不同, 所有这里我可以复用创建一个ModalBlock组件
最后当然是分块显示日时分秒
的TimeBlock
啦.
代码实现
NumRoll
滚动的数字可以参考我以前写的那一篇文章, 创建一个 0-9的列表, 设置它的高度只能显示一条数据, 然后把更改列表的样式 transform: translateY(-${ num }em)
, 就可以实现动画的改变数字.
1 | import React, { useState } from 'react' |
ModalBlock
这里我们需要显示大于10的数字, 然后再显示一个单位区分不同的模块, 上面的数字模块明细只能显示0-9的内容, 所有再这需要对传进来的数字进行拆分
1 | ... |
样式部分
1 | .modal_block + .modal_block{ |
TimeModal
这里的视图内容很简单, 就是把ModalBlock分别显示就可以
1 |
|
这里也没啥样式, 主要就是要让里面的元素横向排列
1 | .flex-wrap{ |
计时器, 时间计算
react的Hooks真的十用了完全回不去了, 前一篇我照着文档写了一大篇Class, state贼难维护, 又需要super(props)
, 需要遵循ES6的语法, 需要this.setState
计时器的话直接使用 setInterval 来做处理
时间的话还是转行成时间戳自己来计算吧, 这样后面直接对秒进行运算就可以维护计时器了
Date.parse
方法可以处理很多不同格式的时间, 直接转行位时间戳
1 | let timer:any |