Introdução
Agora que o básico do nosso componente está funcional, é hora de implementar efetivamente o contador. Para isso, é preciso utilizar um hook do React, chamado useState;
O hook useState
É chamado dentro de um componente funcional para atualizar e consumir o state de um componente. O state simboliza o estado atual de um componente.
O
useStateretorna um par: o valor do estado atual e uma função para atualizá-lo.
Voltando ao exemplo apresentado na etapa anterior, podemos mostrar na prática os conceitos abordados anteriormente. Para lembrar do exemplo, veja o código abaixo:
_10const [count, setCount] = useState(0)
No trecho acima é importante observar três coisas:
- Na variável
count, é possível consumir o estado atual; setCounté uma função para atualizá-lo;0é o valor do estado inicial
_10const [timeRemaining, setTime] = useState<TimeSplit>({_10 hours: '00',_10 minutes: '00',_10 seconds: '00',_10})
Fazendo seu contador funcionar!
-
Precisamos importar algumas funções e tipos para continuar:
_10//react/Countdown.tsx_10import React, { useState } from 'react'_10import { TimeSplit } from './typings/global'_10import { tick, getTwoDaysFromNow } from './utils/time'A função
getTwoDaysFromNowserá utilizada para tratar condições de borda. Será explicado mais tarde neste passo. -
Adicione o hook de atualização de estado (
useState)_14//react/Countdown.tsx_14const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate }) => {_14+ const [timeRemaining, setTime] = useState<TimeSplit>({_14+ hours: '00',_14+ minutes: '00',_14+ seconds: '00'_14+ })_14_14return (_14<div>_14{ targetDate }_14</div>_14)_14}Observe os detalhes:
timeRemainingé o estado atual,setTimeé a função de atualização do estado,TimeSplité o tipo e, por fim, o objeto{hours: '00', minutes: '00', seconds: '00'}é o estado inicial do componente. -
Adicione uma
targetDatepadrão para o caso de não haver um valor inicial definido. Vamos utilizar para isto uma data que é definida como dois dias a partir da data atual e ela será calculada em uma função utilitária que foi previamente importada da pasta/utils:_10//react/Countdown.tsx_10const DEFAULT_TARGET_DATE = getTwoDaysFromNow() -
Utilize a função
ticke a constanteDEFAULT_TARGET_DATEpara fazer o contador:_16//react/Countdown.tsx_16const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate = DEFAULT_TARGET_DATE }) => {_16const [timeRemaining, setTime] = useState<TimeSplit>({_16hours: '00',_16minutes: '00',_16seconds: '00'_16})_16_16+ tick(targetDate, setTime)_16_16return (_16<div>_16{ targetDate }_16</div>_16)_16} -
Altere o
h1para que ele exiba o contador que criamos. Para isso, precisamos utilizar o estado atualtimeRemaining:_17//react/Countdown.tsx_17const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate = DEFAULT_TARGET_DATE }) => {_17const [timeRemaining, setTime] = useState<TimeSplit>({_17hours: '00',_17minutes: '00',_17seconds: '00'_17})_17_17tick(targetDate, setTime)_17_17return (_17<div>_17- <h1>{ targetDate }</h1>_17+ <h1>{ `${timeRemaining.hours}:${timeRemaining.minutes}:${timeRemaining.seconds}` }</h1>_17</div>_17)_17}A formatação da string do contador está no formato
HH:MM:SS, feita através do split emhours,minuteseseconds.
Assim, com essas alterações, veremos a atualização em tempo real do contador! O resultado na home é esse:

