React 30 秒速学:制作倒计时组件

栏目: 服务器 · 发布时间: 6年前

内容简介:本文译自:渲染倒数计时器,在达到零时打印消息。

本文译自: 30-seconds-of-react 。React 30 秒速学:全篇中文翻译、学习,地址: 30-seconds-of-react-zh_CN-umi ,所有案例进行分析、注释、上线。

渲染倒数计时器,在达到零时打印消息。

  • 使用对象解构来设置 hoursminutesseconds prop 的默认值。
  • 使用 React.useState() 钩子来创建 timepausedover 状态变量,并将它们的值分别设置为传递的props, falsefalse 的值。
  • 创建一个方法 tick ,它根据当前值更新 time 的值(即将时间减少一秒)。
  • 如果 pausedovertruetick 将立即返回。
  • 创建一个方法 reset ,将所有状态变量重置为其初始状态。
  • 使用 React.useEffect() 钩子通过使用 setInterval() 每秒调用 tick 方法,并在卸载组件时使用 clearInterval() 进行清理。
  • 使用 <div>time 状态变量的文本表示形式包装 <p> 元素,以及分别暂停/取消暂停和重启计时器的两个 <button> 元素。
  • 如果 overtrue ,计时器将显示一条消息,而不是 time 的值。
import React from "react";
function CountDown({ hours = 0, minutes = 0, seconds = 0 }) {
  const [paused, setPaused] = React.useState(false);
  const [over, setOver] = React.useState(false);
  // time 默认值是一个 object
  const [time, setTime] = React.useState({
    hours: parseInt(hours),
    minutes: parseInt(minutes),
    seconds: parseInt(seconds)
  });

  const tick = () => {
    // 暂停,或已结束
    if (paused || over) return;
    if (time.hours === 0 && time.minutes === 0 && time.seconds === 0)
      setOver(true);
    else if (time.minutes === 0 && time.seconds === 0)
      setTime({
        hours: time.hours - 1,
        minutes: 59,
        seconds: 59
      });
    else if (time.seconds === 0)
      setTime({
        hours: time.hours,
        minutes: time.minutes - 1,
        seconds: 59
      });
    else
      setTime({
        hours: time.hours,
        minutes: time.minutes,
        seconds: time.seconds - 1
      });
  };

  // 重置
  const reset = () => {
    setTime({
      hours: parseInt(hours),
      minutes: parseInt(minutes),
      seconds: parseInt(seconds)
    });
    setPaused(false);
    setOver(false);
  };

  React.useEffect(() => {
    // 执行定时
    let timerID = setInterval(() => tick(), 1000);
    // 卸载组件时进行清理
    return () => clearInterval(timerID);
  });

  return (
    <div>
      <p>{`${time.hours
        .toString()
        .padStart(2, "0")}:${time.minutes
        .toString()
        .padStart(2, "0")}:${time.seconds.toString().padStart(2, "0")}`}</p>
      <div>{over ? "Time's up!" : ""}</div>
      <button onClick={() => setPaused(!paused)}>
        {paused ? "Resume" : "Pause"}
      </button>
      <button onClick={() => reset()}>Restart</button>
    </div>
  );
}
复制代码
例子
export default function() {
  return <CountDown hours="1" minutes="45" />;
}
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

密码朋克

密码朋克

[澳] 朱利安·阿桑奇 / Gavroche / 中信出版社 / 2017-10 / 42.00元

互联网已经在世界各地掀起了革命,然而全面的打击也正在展开。随着整个社会向互联网迁移,大规模监控计划也正在向全球部署。我们的文明已经来到一个十字路口。道路的一边通往一个承诺“弱者要隐私,强 者要透明”的未来,而另一边则通往一个极权的互联网,在那里,全人类的权力被转移给不受问责的间谍机构综合体及其跨国公司盟友。 密码朋克是一群倡导大规模使用强密码术以保护我们的基本自由免遭攻击的活动家。维基解密的......一起来看看 《密码朋克》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器