Documentation
Feedback
Guides
Learning Center

Learning Center
Learning Center
Criando a funcionalidade do bloco countdown
View in English
This content was migrated from the VTEX Learning Center and is no longer being actively maintained. For the most accurate and up-to-date information, please check the official documentation.

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 useState retorna 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:


_10
const [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

_10
const [timeRemaining, setTime] = useState<TimeSplit>({
_10
hours: '00',
_10
minutes: '00',
_10
seconds: '00',
_10
})

Fazendo seu contador funcionar!

  1. Precisamos importar algumas funções e tipos para continuar:


    _10
    //react/Countdown.tsx
    _10
    import React, { useState } from 'react'
    _10
    import { TimeSplit } from './typings/global'
    _10
    import { tick, getTwoDaysFromNow } from './utils/time'

    A função getTwoDaysFromNow será utilizada para tratar condições de borda. Será explicado mais tarde neste passo.

  2. Adicione o hook de atualização de estado (useState)


    _14
    //react/Countdown.tsx
    _14
    const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate }) => {
    _14
    + const [timeRemaining, setTime] = useState<TimeSplit>({
    _14
    + hours: '00',
    _14
    + minutes: '00',
    _14
    + seconds: '00'
    _14
    + })
    _14
    _14
    return (
    _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.

  3. Adicione uma targetDate padrã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
    _10
    const DEFAULT_TARGET_DATE = getTwoDaysFromNow()

  4. Utilize a função tick e a constante DEFAULT_TARGET_DATE para fazer o contador:


    _16
    //react/Countdown.tsx
    _16
    const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate = DEFAULT_TARGET_DATE }) => {
    _16
    const [timeRemaining, setTime] = useState<TimeSplit>({
    _16
    hours: '00',
    _16
    minutes: '00',
    _16
    seconds: '00'
    _16
    })
    _16
    _16
    + tick(targetDate, setTime)
    _16
    _16
    return (
    _16
    <div>
    _16
    { targetDate }
    _16
    </div>
    _16
    )
    _16
    }

  5. Altere o h1 para que ele exiba o contador que criamos. Para isso, precisamos utilizar o estado atual timeRemaining:


    _17
    //react/Countdown.tsx
    _17
    const Countdown: StorefrontFunctionComponent<CountdownProps> = ({ targetDate = DEFAULT_TARGET_DATE }) => {
    _17
    const [timeRemaining, setTime] = useState<TimeSplit>({
    _17
    hours: '00',
    _17
    minutes: '00',
    _17
    seconds: '00'
    _17
    })
    _17
    _17
    tick(targetDate, setTime)
    _17
    _17
    return (
    _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 em hours, minutes e seconds.

Assim, com essas alterações, veremos a atualização em tempo real do contador! O resultado na home é esse:

{"base64":"  ","img":{"width":3810,"height":1930,"type":"png","mime":"image/png","wUnits":"px","hUnits":"px","length":1461385,"url":"https://user-images.githubusercontent.com/19495917/75474406-b3c06e80-5975-11ea-82ec-89ab27504873.png"}}

{"base64":"  ","img":{"width":996,"height":596,"type":"gif","mime":"image/gif","wUnits":"px","hUnits":"px","length":18702,"url":"https://user-images.githubusercontent.com/19495917/75474511-e0748600-5975-11ea-825d-7e9a20f95362.gif"}}

Answer sheet

See answer sheet for Countdown.tsx
Countdown.tsx

_44
// store-block/react/Countdown.tsx
_44
import React, { useState } from 'react'
_44
import { TimeSplit } from './typings/global'
_44
import { tick, getTwoDaysFromNow } from './utils/time'
_44
_44
interface CountdownProps {
_44
targetDate: string
_44
}
_44
_44
const DEFAULT_TARGET_DATE = getTwoDaysFromNow()
_44
_44
const Countdown: StorefrontFunctionComponent<CountdownProps> = ({
_44
targetDate = DEFAULT_TARGET_DATE,
_44
}) => {
_44
const [timeRemaining, setTime] = useState<TimeSplit>({
_44
hours: '00',
_44
minutes: '00',
_44
seconds: '00',
_44
})
_44
_44
tick(targetDate, setTime)
_44
_44
return (
_44
<div>
_44
<h1>{`${timeRemaining.hours}:${timeRemaining.minutes}:${timeRemaining.seconds}`}</h1>
_44
</div>
_44
)
_44
}
_44
_44
Countdown.schema = {
_44
title: 'editor.countdown.title',
_44
description: 'editor.countdown.description',
_44
type: 'object',
_44
properties: {
_44
targetDate: {
_44
title: 'Data final',
_44
description: 'Data final utilizada no contador',
_44
type: 'string',
_44
default: null,
_44
},
_44
},
_44
}
_44
_44
export default Countdown

On this page