完成后如何重置计时器组件

时间:2019-05-07 18:57:53

标签: javascript reactjs ecmascript-6 timer

我正在尝试使用react-countdown-now软件包https://www.npmjs.com/package/react-countdown-now#key构建计时器组件。

我在重置计时器时遇到麻烦,因此无法按计划继续进行下一次计时。

我一直在尝试在道具中使用键属性,它会在一系列时间中将其传递给它,直到它(在文档中)。实际上,我将从服务器端方法获取调度的这些值。

目前我有

组件:

<Countdown
     date={Date.now() + 5000}
     key = {timeDelays}
     intervalDelay={0}
     precision={3}
     renderer={timerRenderer}
/>

支持的功能和值:

//These time values are most probably going to be in JSON format, 
//and probably will contain EPOCH times for scheduled events

const timeDelays = [2000,4000,3000,15789,2345794];

// Random component
const Completionist = () => <span>You are good to go!</span>;

// Renderer callback with condition
const timerRenderer = ({ hours, minutes, seconds, completed }) => {
     // if (completed) {
        //     Render a completed state
        //     return <Completionist />;
     // } else {
     //     // Render a countdown
            return <span>{hours}:{minutes}:{seconds}</span>;
     //}
};

我希望它从列表中开始倒计时,然后在完成时移至列表中的下一个计划值。

3 个答案:

答案 0 :(得分:1)

与以前的答案(使用基于类的组件)完全不同。

首先,我们需要将react和react钩子导入到我们的组件文件中。

import React, { useState } from 'react';

接下来,我们将声明一个react函数组件,并使用react钩子维护状态。

function MyCountdownTimer({ times }) {
    // a hook for the current time index
    const [currentTimeIndex, setCurrentTimeIndex] = useState(0);
    // a hook for the current time
    const [currentTime, setCurrentTime] = useState(null);
    // return a render
    return (
        <Countdown
            date={currentTime}
            key={currentTimeIndex}
            onComplete={() => {
                // dont's move to next time if just done with last time
                if(times.length - 1 <= times.indexOf(currentTime)) return;
                // move to next time index
                setCurrentTimeIndex(currentTimeIndex + 1);
                // reset current time
                setCurrentTime(new Date(times[currentTimeIndex + 1]));
            }}
            renderer={({ hours, minutes, seconds, completed }) => {
                // render completed
                if (completed) return <span>You are good to go!</span>;
                // render current countdown time
                return <span>{hours}:{minutes}:{seconds}</span>;

            }}
        />
    );
}

这样的实现看起来像这样。

let times = [...] // an array of times

<MyCountdownTimer times={times} />

React钩子还是有点新,因此为了更好地了解React Hooks,您可以点击此链接https://reactjs.org/docs/hooks-intro.html

注意

  1. 您需要一种方法来告诉您当前的工作时间,因此在组件中您将有两件事。时间列表(times)的数组,应按照上面代码中的建议作为prop传递,当前时间(currentTimeIndex)的索引为整数,当前时间({ {1}})作为日期对象。

  2. 您将需要使用currentTime属性定义计时器方法来监听计时器为零时的情况,当倒数计时器完成时,我们不会更新组件的状态。

  3. Countdown组件的一个关键属性,它意味着每次您要重置倒数计时器时都会更改,并且由于我们要增加索引以转到下一次,我们将仅使用索引当前时间。

  4. 我减少了渲染器的代码,因此您可以在同一函数中渲染所需的内容,除非您要在其中添加更多的代码。

  5. 这正在使用带有hooks的功能组件来维持状态。

  6. 根据文档提供的日期可以是日期对象。

希望这有助于回答您的问题。

答案 1 :(得分:0)

我想我的翻译组件看起来像这样

const WebPage = (props) => {
        const timerState = {
                times:[Date.now()+5000,Date.now()+12000,Date.now()+17000,Date.now()+22000],
                currentTimeIndex: 0,
                currentTime: Date.now(),
        } ;
        const timerRenderer = ({ hours, minutes, seconds, completed }) => {
                if (completed) return <span> No more Scheduled time</span>;
                return <span>{hours}:{minutes}:{seconds}</span>;
        };
        const completeTime = () => {
                if (timerState.times.length - 1 <= times.indexOf(timerState.currentTime)) return;
                // move to next time
                timerState.currentTimeIndex++;
                timerState.currentTime = new Date(timerState.times[timerState.currentTimeIndex+1])
        };
        return (
                <Countdown
                     date={timerState.currentTime}
                     key = {timerState.currentTimeIndex}
                     onComplete={completeTime}
                     intervalDelay={0}
                     precision={3}
                     renderer={timerRenderer}
                />
        ) 
}

它不能完全正常工作,因为默认情况下它变为“不再安排时间”,并且如果我摆脱了if(completed),它将停留在0:0:0。

答案 2 :(得分:0)

只需要改变键属性key={new values or updated value}的值,自动重新设置定时器。

<块引用>

键 这是 React 的内部组件 props 之一,用于标识组件。但是,我们可以利用这种行为,例如通过传入新的字符串或数字来重新开始倒计时。enter link description here