Эта статья переведена с:30-seconds-of-react. Быстрое обучение React за 30 секунд: полный китайский перевод, обучение, адрес:30-seconds-of-react-zh_CN-umi, все случаи анализируются, аннотируются и запускаются.
Серия статей:
- React 30 Seconds Quick Learning: рендеринг данных массива в списки и таблицы
- Реагируйте за 30 секунд: сделайте поле ввода, пароль видимым, компонент ползунка, раскрывающийся селектор, компонент флажка
- Реагируйте быстро за 30 секунд: создайте многострочный текстовый компонент, ограничьте количество символов и слов
- React Quick Learning за 30 секунд: реализация сворачиваемых, бесконечно иерархических компонентов дерева
- Реагируйте быстро за 30 секунд: создайте текстовый компонент, который автоматически распознает ссылки
- Реагируйте быстро за 30 секунд: создание компонента аккордеона
- Реагируйте быстро за 30 секунд: создание компонента карусели
- Реагируйте быстро за 30 секунд: создание компонента складной панели
- Реагируйте быстро за 30 секунд: создание компонента обратного отсчета
- Реагируйте быстро за 30 секунд: создание компонента перетаскивания файлов
- Реагируйте быстро за 30 секунд: создание компонента модального окна
- Реакция 30 секунд: изготовление компонентов звездного рейтинга
- Быстро реагируйте за 30 секунд: создание компонента вкладки
компонент обратного отсчета
Отображает таймер обратного отсчета, выводя сообщение при достижении нуля.
- Используйте деструктурирование объекта для установки
hours
,minutes
а такжеseconds
Значение по умолчанию реквизита. - использовать
React.useState()
крючок для созданияtime
,paused
а такжеover
переменные состояния и установить их значения в переданные реквизиты соответственно,false
а такжеfalse
ценность . - создать метод
tick
, который обновляется на основе текущего значенияtime
значение (то есть уменьшить время на одну секунду). - если
paused
илиover
даtrue
,tick
вернется немедленно. - создать метод
reset
, сбрасывает все переменные состояния в исходное состояние. - использовать
React.useEffect()
крючок с помощьюsetInterval()
звонков в секундуtick
метод и использовать при выгрузке компонентаclearInterval()
Очистить. - использовать
<div>
использоватьtime
Оболочка текстового представления для переменных состояния<p>
элемент и два для приостановки/возобновления и перезапуска таймера соответственно<button>
элемент. - если
over
дляtrue
, таймер отобразит сообщение вместо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" />;
}