1
resposta

[Dúvida] Adicionando tarefas

Eu não estava conseguindo adicionar as tarefas e o meu timer tava esquisito, só podendo colocar a partir de 15h no cronômetro. Aí eu fui comparar o meu código com o do GitHub, e vi que tinha umas partes do componente Formulario que eu perdi e não vi sendo colocadas nas aulas:

Código completo do Formulario.tsx:

import React from 'react';
import { ITarefa } from '../../types/tarefa';
import Botao from '../Botao';
import style from './Formulario.module.scss';

class Formulario extends React.Component<{
  setTarefas: React.Dispatch<React.SetStateAction<ITarefa[]>>
}> {
  state = {
    tarefa: "",
    tempo: "00:00"
  }

  adicionarTarefa(evento: React.FormEvent<HTMLFormElement>) {
    evento.preventDefault();
    this.props.setTarefas(tarefasAntigas => [...tarefasAntigas, { ...this.state }])
  }

  render() {
    return (
      <form className={style.novaTarefa} onSubmit={this.adicionarTarefa.bind(this)}>
        <div className={style.inputContainer}>
          <label htmlFor="tarefa">
            Adicione um novo estudo
          </label>
          <input
            type="text"
            name="tarefa"
            id="tarefa"
            value={this.state.tarefa}
            onChange={evento => this.setState({ ...this.state, tarefa: evento.target.value })}
            placeholder="O que você quer estudar"
            required
          />
        </div>
        <div className={style.inputContainer}>
          <label htmlFor="tempo">
            Tempo
          </label>
          <input
            type="time"
            step="1"
            name="tempo"
            value={this.state.tempo}
            onChange={evento => this.setState({ ...this.state, tempo: evento.target.value })}
            id="tempo"
            min="00:00:00"
            max="01:30:00"
            required
          />
        </div>
        <Botao type="submit">
          Adicionar
        </Botao>
      </form>
    )
  }
}

export default Formulario;

especificamente as seguintes partes dentro de ambos os inputs:

  value={this.state.tarefa}
            onChange={evento => this.setState({ ...this.state, tarefa: evento.target.value })}

e value={this.state.tempo} onChange={evento => this.setState({ ...this.state, tempo: evento.target.value })}

Em que momento essas partes foram colocadas durante a aula? Eu acho que me perdi no meio de tanto código, então não entendi porque foram adicionados esses atributos (value e onChange), só sei que depois de colocar essas partes no meu código o cronômetro e a função de adicionar tarefas começaram a funcionar direitinho. Alguém pode me explicar, por favor, essas partes do código?

1 resposta

Oi Mylena. Tudo bem?

Os atributos value e onChange que você mencionou são fundamentais para que o React possa controlar o estado dos inputs do seu formulário. Isso é o que chamamos de "componentes controlados".

  1. value: Este atributo é usado para definir o valor do input com base no estado do componente. No seu caso, value={this.state.tarefa} e value={this.state.tempo} garantem que o que está no estado do componente é o que aparece no input. Isso ajuda a manter a interface do usuário sincronizada com o estado da aplicação.

  2. onChange: Este atributo é usado para atualizar o estado do componente sempre que o usuário digita algo no input. A função onChange={evento => this.setState({ ...this.state, tarefa: evento.target.value })} atualiza o estado tarefa sempre que o usuário digita algo no campo de texto. De forma similar, onChange={evento => this.setState({ ...this.state, tempo: evento.target.value })} atualiza o estado tempo quando o usuário ajusta o cronômetro.

Essas partes do código são essenciais para que as mudanças que você faz nos inputs sejam refletidas no estado do componente, e, consequentemente, em qualquer outra parte do seu aplicativo que dependa desse estado.

Essas adições no código foram feitas na atividade Controlando o formulário caso queira conferir o conteúdo.

Espero ter ajudado!

Siga firme nos seus estudos e conte com o fórum sempre que precisar.

Abraços :)

Caso este post tenha lhe ajudado, por favor, marcar como solucionado