Taro关于多个数组同时根据时间展示倒计时的代码组件

news2024/11/28 16:31:04

我们通常在做秒杀活动时,会有活动开始或者活动结束倒计时
而在活动列表中,需要做统一处理
以下为做的关于倒计时的组件~

primaryColor可忽略,是关于倒计时时间的主题色
startTime活动开始时间
endTime活动结束时间
refresh方法为其中一个倒计时结束后,页面的重新渲染方法,经常是重新请求列表接口,方法自定义

组件文件

import React, { Component, CSSProperties } from 'react';
import { View } from '@tarojs/components';
import { isFunction } from 'lodash-es';
import { hexToRgba, iosTimeStringFomat } from '@/application/utils/format';
import './index.scss';

interface PaymentRewardCountdownProps {
  primaryColor: string;
  startTime: string;
  endTime: string;
  refresh(): void;
}
interface PaymentRewardCountdownState {
  timeRemaining: TimeRemaining | null;
}
interface TimeRemaining {
  type: 'start' | 'end' | 'ended';
  value: number;
}

export default class PaymentRewardCountdown extends Component<
  PaymentRewardCountdownProps,
  PaymentRewardCountdownState
> {
  constructor(props: PaymentRewardCountdownProps) {
    super(props);
    this.state = {
      timeRemaining: null
    };
  }

  componentDidMount(): void {
    const { startTime, endTime, refresh } = this.props;
    const iosStartTime = iosTimeStringFomat(startTime);
    const iosEndTime = iosTimeStringFomat(endTime);
    this.timer = setInterval(() => {
      const now = new Date();
      const start = new Date(iosStartTime);
      const end = new Date(iosTimeStringFomat(iosEndTime));

      if (now < start) {
        const diff = start.getTime() - now.getTime();
        this.setState({ timeRemaining: { type: 'start', value: diff } });
      } else if (now < end) {
        const diff = end.getTime() - now.getTime();
        this.setState({ timeRemaining: { type: 'end', value: diff } });
      } else {
        this.setState({ timeRemaining: { type: 'ended', value: 0 } });
        clearInterval(this.timer);
        if (isFunction(refresh)) {
          refresh();
        }
      }
    }, 1000);
  }

  componentWillUnmount() {
    if (this.timer) {
      clearInterval(this.timer);
    }
  }

  private timer: NodeJS.Timeout;

  private renderCountdown = () => {
    const { primaryColor } = this.props;
    const { timeRemaining } = this.state;
    if (!timeRemaining) {
      return null;
    }
    const numberStyle: CSSProperties = {
      color: primaryColor,
      background: `${hexToRgba(primaryColor, 0.5)}`
    };
    const timeInfo = formatSeconds(timeRemaining.value / 1000);
    return (
      <View className={classes.right}>
        <View className={classes.prefix}>
          {timeRemaining.type === 'start' ? '距离开始' : '距离结束:'}</View>
        <View className={classes.number} style={numberStyle}>
          {timeInfo.days}
        </View>
        <View className={classes.symbol}></View>
        <View className={classes.number} style={numberStyle}>
          {timeInfo.hours}
        </View>
        <View className={classes.symbol}></View>
        <View className={classes.number} style={numberStyle}>
          {timeInfo.minutes}
        </View>
        <View className={classes.symbol}></View>
        <View className={classes.number} style={numberStyle}>
          {timeInfo.seconds}
        </View>
        <View className={classes.symbol}></View>
      </View>
    );
  };

  render() {
    return <View className={prefix}>{this.renderCountdown()}</View>;
  }
}

const prefix = 'payment-reward-countdown';
const classes = {
  right: `${prefix}__right`,
  prefix: `${prefix}__right__prefix`,
  number: `${prefix}__right__number`,
  symbol: `${prefix}__right__symbol`
};
interface DataInfo {
  days: number;
  hours: string;
  minutes: string;
  seconds: string;
}
function addLeadingZero(num: number): string {
  if (num < 10) {
    return `0${num}`;
  }
  return num.toString();
}
function formatSeconds(time: number): DataInfo {
  const days = Math.floor(time / (3600 * 24));
  const hours = addLeadingZero(Math.floor((time % (3600 * 24)) / 3600));
  const minutes = addLeadingZero(Math.floor((time % 3600) / 60));
  const seconds = addLeadingZero(Math.floor(time % 60));

  return {
    days,
    hours,
    minutes,
    seconds
  };
}

样式文件

.payment-reward-countdown {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: space-between;
  &__right {
    height: 32px;
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: flex-end;
    &__prefix {
      font-size: $font-size-mini;
    }
    &__number {
      padding: 0 6px;
      height: 32px;
      font-weight: 500;
      font-size: 22px;
      color: #FF3B30;
      line-height: 32px;
      text-align: center;
      background: rgba(255,59,48,0.05);
      border-radius: 4px;
    }
    &__symbol {
      padding: 0 6px;
      color: #666666;
      line-height: 28px;
      text-align: center;
      font-size: 20px;
      font-weight: bold;
    }
  }
}

在数组的item文件中,直接调用时间组件

<PaymentRewardCountdown
   startTime={market.startTime}
   endTime={market.endTime}
   refresh={this.refresh}
   primaryColor={primaryColor}
 />

示例图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1560415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式智能产品开发实战】(七)—— 政安晨:通过ARM-Linux掌握基本技能【环境准备:树莓派】

目录 Raspberry Pi OS 下载系统镜像 使用SSH客户端登陆 升级更新 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正…

iptables 与 firewalld 防火墙

iptables iptables 是一款基于命令行的防火墙策略管理工具 四种防火墙策略&#xff1a; ACCEPT&#xff08;允许流量通过&#xff09; 流量发送方会看到响应超时的提醒&#xff0c;但是流量发送方无法判断流量是被拒绝&#xff0c;还是接收方主机当前不在线 REJECT&#xff08…

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测

区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测 目录 区间预测 | Matlab实现带有置信区间的BP神经网络时间序列未来趋势预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 BP神经网络(Backpropagation neural network)是一种常用的人工神…

实验报告学习——gdb的使用

gdb的使用: l查看源码和行号 p a或main::a&#xff08;main函数中a)打印变量a的值 要打印单个寄存器的值&#xff0c;可以使用“i registers eax”或者“p $eax” 设置断点b 5&#xff08;根据行数&#xff09;/main&#xff08;根据函数&#xff09;/*0x40059b&#xff0…

【键值皆有序map 线段树 数学 】100240. 最小化曼哈顿距离

本文涉及知识点 键值皆有序map 线段树 数学 LeetCode100240. 最小化曼哈顿距离 给你一个下标从 0 开始的数组 points &#xff0c;它表示二维平面上一些点的整数坐标&#xff0c;其中 points[i] [xi, yi] 。 两点之间的距离定义为它们的曼哈顿距离。 请你恰好移除一个点&am…

大数据-TXT文本重复行计数工具

支持系统类型&#xff1a;Windows 64位系统 Linux 64位系统 苹果64位系统 硬盘要求&#xff1a;固态硬盘&#xff08;有效剩余磁盘空间大小最低3倍于大数据文件的大小&#xff09; 内存要求&#xff1a;最低8G&#xff08;例如只有几百G数据&#xff09; 如果处理TB级大数据文…

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…

[linux初阶][vim-gcc-gdb] OneCharter: vim编辑器

一.vim编辑器基础 目录 一.vim编辑器基础 ①.vim的语法 ②vim的三种模式 ③三种模式的基本切换 ④各个模式下的一些操作 二.配置vim环境 ①手动配置(不推荐) ②自动配置(推荐) vim是vi的升级版,包含了更加丰富的功能. ①.vim的语法 vim [文件名] ②vim的三种模式 命令…

《权力》为什么只为某些人所拥有 - 三余书屋 3ysw.net

权力&#xff1a;为什么只为某些人所拥有 大家好&#xff0c;今天我们解读的书名是《权力》&#xff0c;副标题是“为什么只为某些人所拥有”。该书深入探讨了职场中的权力议题&#xff0c;强调获得权力是关键的职场技能之一。在激烈的职场竞争中&#xff0c;缺乏这一技能将使…

14 Games101 - 笔记 - 光线追踪(利用包围盒技术加速光线追踪(KD-Tree and BVH)

14 光线追踪&#xff08;利用包围盒技术加速光线追踪&#xff08;KD-Tree and BVH&#xff09; 在上一节中&#xff0c;我们介绍了whited-style光线追踪的原理&#xff0c;以及实现细节。相比与光栅化中所使用的的Blinn-Phong模型&#xff0c;光线追踪显著了提升了图像质量&am…

《极客时间TonyBai go语言第一课》学习笔记

文章目录 前置篇显式组合并发 入门篇Go 包的初始化次序![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1388d0d1bddd4a37b98eba5fcb41fc4d.png)初始化一个项目 大纲 前置篇 显式 在 C 语言中&#xff0c;下面这段代码可以正常编译并输出正确结果&#xff1a; #i…

C#.net8创建webapi,使用SqlSugar,仓储模式,DTO,服务层,控制层的综合应用(企业级)

本文源码地址: https://download.csdn.net/download/u012563853/89036104 源码中,也有详细的注释说明。 代码总览: 这是一个综合性比较强的文章,需要有一定的基础,没有基础的人,看了后,会全面的了解一下,有基础的人,看了后会加强认识,更加的巩固,直接在项目中去应…

人工智能时代:如何运用Excel函数与公式结合AI应用办公

前言 本文将结合人工智能的概念和Excel的高级功能&#xff0c;通过具体、详细的示例&#xff0c;展示如何利用Excel的函数与公式提升数据处理和分析的效率。博客内容涵盖基础函数的使用、高级公式的构建、以及如何通过编程接口与Excel进行交互&#xff0c;实现自动化和智能化的…

Python爬虫快速上手,知识介绍与实战demo

目录 前言 一、爬虫是什么&#xff1f; 二、爬虫的基本流程&#xff1a; 三、http协议 请求与响应 四、 request 五、 响应Response 六、总结 七、简单实战demo 前言 简单来说互联网是由一个个站点和网络设备组成的大网&#xff0c;我们通过浏览器访问站点&#xff0c;站点把HT…

混合现实(MR)开发工具

混合现实&#xff08;MR&#xff09;开发工具是一系列软件和框架&#xff0c;它们使得开发者能够创建和优化能够在虚拟与现实世界之间无缝交互的应用程序。以下是一些在MR领域内广泛使用的开发工具。 1.Microsoft Mixed Reality Toolkit (MRTK) MRTK是一个跨平台的工具包&…

Yarn与Zookeeper的介绍

Yarn--三大调度策略 FIFO(先进先出): 目前几乎已经没有人使用了. 类似于: 单行道. 好处: 每个计算任务能独享集群100%的资源. 弊端: 不能并行执行, 如果大任务过多, 会导致小任务执行时间过长. Capacity(容量调度): 我们用…

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&…

亮数据,可视化数据采集强大利器

前言 随着信息技术的飞速发展&#xff0c;我们已经进入了一个以数据为中心的世纪。在这个时代&#xff0c;数据不仅仅是信息的载体&#xff0c;它已经成为了推动社会进步、创新科技、增强决策和驱动经济增长的关键资源。 在这个数据世纪中&#xff0c;掌握数据的能力等同于掌…

计算机网络—VLAN 间路由配置

目录 1.拓扑图 2.实验环境准备 3.为 R3 配置 IP 地址 4.创建 VLAN 5.配置 R2 上的子接口实现 VLAN 间路由 6.配置文件 1.拓扑图 2.实验环境准备 配置R1、R3和S1的设备名称&#xff0c;并按照拓扑图配置R1的G0/0/1接口的IP地址。 [Huawei]sysname R1 [R1]interface Giga…

希亦、洁盟、大宇超声波清洗机好用吗?比拼谁是性价比之王

在追求高效生活品质的今天&#xff0c;超声波清洗机以其独特的清洁技术和便捷的操作方式&#xff0c;成为了家用和商用清洁领域的新宠。尤其对于眼镜用户而言&#xff0c;一台高效的超声波清洗机不仅能够轻松去除镜片上的污渍和细菌&#xff0c;更能保护镜片不受损伤&#xff0…