栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2022-07-20 工作记录-React-js将时间戳转换成“天时分秒” + “天时分秒”的倒计时

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022-07-20 工作记录-React-js将时间戳转换成“天时分秒” + “天时分秒”的倒计时

一、实现效果

假如后端返了两个数据:当前时间的13位时间戳currentTime、到期时间的13位时间戳expireTime,想实现“还有多久到期的时间”的倒计时,即:到期时间与当前时间之间的时间差以“天时分秒”的形式进行倒计时,如下动图:

二、实现方式 第一步、封装方法——js将时间戳转换成“天时分秒”

utils.js:

function countDown(inputTime, isPop = false) {
  // 最终时间结果对象
  const finalDateObj = {
    d: null, // 天
    h: null, // 小时
    m: null, // 分钟
    s: null, // 秒
  }
  //剩余时间总的毫秒数 除以 1000 变为总秒数(时间戳为13位 需要除以1000,为10位 则不需要)
  let dec = inputTime / 1000;
  if (dec <= 0) {
    dec = 0;
  }
  //得到天 格式化成前缀加零的样式
  let d = parseInt(dec / 60 / 60 / 24);
  d = d < 10 ? '0' + d : d;
  //得到小时 格式化成前缀加零的样式
  let h = parseInt(dec / 60 / 60 % 24);
  h = h < 10 ? '0' + h : h;
  //得到分钟 格式化成前缀加零的样式
  let m = parseInt(dec / 60 % 60);
  m = m < 10 ? '0' + m : m;
  //得到秒 格式化成前缀加零的样式
  let s = parseInt(dec % 60);
  s = s < 10 ? '0' + s : s;

  finalDateObj.d = d;
  finalDateObj.h = h;
  finalDateObj.m = m;
  finalDateObj.s = s;
  
  // 两种返回结果
  return isPop ? `${d}天${h}小时${m}分${s}秒` : finalDateObj;
}
第二步、实现“天时分秒”的倒计时

实现思路:⭐️

  • 1、先在state里定义两个属性:
    • finalDate——倒计时初始值(初始化为字符串 “00天00时00分”),
    • canMountDown——判断是否开启定时器。
  • 2、初始化定时器timer为null ;
  • 3、定义一个方法FunTimer(里面写一个setInterval定时器timer,装实现倒计时的代码(我封装成了一个函数updateTime)),
  • 4、在componentDidMount里进行判断:
    • 若canMountDown为true,就调用方法FunTimer,并把canMountDown置为false;
    • 若canMountDown为false,就把timer定时器关了,并把canMountDown置为true;
  • 5、编写函数updateTime:【实现倒计时的代码】
    • 第1步、获取到当前时间和过期时间;
    • 第2步、手动把获取到的当前时间 隔一秒加1s 得到新的当前时间;
    • 第3步、 引入上面封装好的方法countDown(js将时间戳转换成“天时分秒”),将到期时间与新的当前时间的差值传进去,获取到对应的“天时年分”,并赋值到state里的finalDate;
    • 第4步、将state里的finalDate写到html对应位置 就大功告成啦~
  • 6、在componentWillUnmount里关闭定时器

tasksDetails.jsx:

【store相关的代码不完整,只可查看,不可复用哦,其就是与接口相关滴代码,小萝卜儿们根据自己平时的思路来即可~】

import React,{Component} from 'react';
import { countDown } from '@src/utils/utils'; // 引入上面封装好的方法——`js`将时间戳转换成“天时分秒”
import {store} from '@src/utils/store'; // 引入store【store相关的是我项目相关的,小萝卜儿们可根据实际情况处理】

class CountDown extends Component{

	// 1、初始化state
  	state = { 
    	canCountDown: true, // 判断是否开启定时器
   		finalDate: '00天00小时00分', // 倒计时初始值
  	}
  	
  	// 2、初始化定时器
    timer = null; 

	async componentDidMount() {
		await store.getQueryTasks(); // 调用接口-获取到任务列表里的数据

		// 4、是否开启倒计时处理
    	if (this.state.canCountDown) {
      		this.setState({ canCountDown: false })
      		this.FunTimer(); // 调用函数-倒计时
    	} else {
      		this.setState({ canCountDown: true })
      		clearInterval(this.timer); // 关闭定时器
    	}
  	}
  	
    // 6、在componentWillUnmount里关闭定时器
	componentWillUnmount() {
    	clearInterval(this.timer); // 关闭定时器
  	}
  
   	// 3、封装函数-倒计时
  	FunTimer = () => {
    	this.timer = setInterval(async () => {
      		// 想实现倒计时的代码就写在这里啦~【我单独封装了一个函数】
      		await this.updateTime();
    	}, 1000)
  	}

	// 5、更新时间
  	updateTime = () => {
    	const expireTimestamp = 1660970113000; // 到期时间【实际情况时 由后台返回,这儿写死只是做个测试】
    	const { timestamp } = store; // 获取到后台返的当前时间的时间戳【注意:这个要在store里单独进行处理哦】
    	
    	const timestamp1 = timestamp * 1 + 1000;
    	
    	const result = countDown(expireTimestamp * 1 - timestamp1 * 1, true);
    	this.setState({
      		finalDate: result,
    	})
    	
    	store.setTimestamp(timestamp1); 
  	}
    
    render(){
	    return(
		    
倒计时:{this.state.finalDate}
) } } export default CountDown;

store/index.js:

【这里是处理接口的部分代码,代码不完整,不可直接复用】

import { makeAutoObservable } from 'mobx';
import API from '../api/index';

const store = makeAutoObservable({
  
  tasksList: {},
  
  timestamp: null,

  
  setTasksList(tasksList) {
    this.tasksList = tasksList;
  },
  
  setTimestamp(timestamp) {
    this.timestamp = timestamp;
  },

  
  async getQueryTasks() {
    const { data, success } = await API.queryTasks(); // 调用接口
    if (data && success) {
      this.setTasksList(data); // 设置任务列表数据
      this.setTimestamp(data.timestamp); // 设置 任务列表-当前时间的时间戳
    }
  },

});
export default store;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1023194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号