Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

6
respostas

aula confusa

o prof é muito bom, mas eu nao deixo de me perguntar: esse seria o melhor projeto pra INICIAR estudos de REACT?

6 respostas

Qual seria sua dúvida, Daniel?

Posso tentar te ajudar se conseguir compartilhar. Qual parte você achou confusa?

ali na aula que finaliza o formulario, quando terminamos a listaSuspensa, foi muita inclusao de tema item tema item de uma maneira um pouco automatica, teve algumas correções em cima da hora sem muito comentário, nao consegui acompanhar, e depois veio a aula seguinte com o formData, me deu bug. A verdade é que estou vendo muita coisa nas ultimas semanas... de qualquer forma, estou fazendo essa carreira/trilha de front-end REACT e depois que saí de js e entrei aqui no REACT, tenho a impressão de que me falta conceitos basicos de useSTATE antes de avanças, por exemplo, com um formData de react 19...

Vou fazer uma observação: eu noto que na alura, na maioria das vezes, as especificidades de um trecho de codigo, de uma função, ou a implementação de uma funcikonalidade muito especifica, é introduzida primeiro, é uma novidade introduzida quase que do nada, sem uma contextualização antes. Eu nao sei como acontece com as pessoas em geral, mas eu sou como o REACt, se vem uma linha que eu nao entendo, eu travo KKKKKKKKKKKKKKK eu preciso de contexto antes, um minimo. Agora mesmo eu vi a criação da consta eventos dentro de aoSubmeterFormulario e eu nao entendi nada pq ja temos uma const eventos em App.jsx, e tambem porque o tema formData é muito novo. Dá pau. Mas se houvesse uma contextualização minima antes, ex "Esta conts evento é um objeto temporário que reúne os dados que foram preenchidos no formulário, como a capa, o tema, a data e o título. Ele é criado para ser usado logo após a submissão do formulário, com os dados que o usuário acabou de inserir" eu ja ia conseguir seguir acompanhando.... E essa contextualização muitas vezes vem DEPOIS, so que antes de chegar nesse momento de contextualização da aula, eu ja parei tudo, fui na IA, pesquisei, demorei um dia, com a aula pausada. as enfim, talvez a minha maneira de aprender seja diferente. Seguimos kkkk

resultado: busquei um pouco com IA, retornei o video 3x, e consegui entender o formData. Seguimos!

Agora sim, entendi. E obrigado por detalhar — inclusive esse último comentário, que ajuda a fechar o diagnóstico.

Só que eu vou discordar da conclusão que você tirou dele.

Não é que a especificidade chega antes do contexto. É que map, find, destructuring e FormData não são conteúdo desse curso. Eu não contextualizo porque, no desenho da trilha, eles aparecem antes.

Repara no que eu explico na aula: por que o componente recebe props, o que o action do form faz, como o estado atualiza a tela. Isso é React, e isso tem contexto.

O que passa direto é justamente o que veio de antes.

E aí chegamos no ponto que eu acho que é o mais importante dessa conversa:

Você não está com dúvida de React. Você está com dúvida sobre várias camadas diferentes que chegam juntas dentro de um código React.

Conta comigo: map, find, destructuring, spread, FormData, atributo name, escopo de variável, props, JSX, useState. Dez coisas na mesma aula. Algumas são React, outras são JavaScript, outras são HTML de vinte anos atrás.

Elas aparecem misturadas na mesma tela. E a sensação que isso gera é uma só:

"Eu não entendo React."

Quando o que está rolando é provavelmente:

"Eu entendo partes de React, mas ainda não leio JavaScript de forma fluente."

Repara nas linhas que te travaram: o map, o find, o ...rest, e agora o evento. Nenhuma delas é conceito de React.

Vamos por essa última.

O evento que te travou

Primeiro, os nomes são diferentes. No App existe eventos, plural — a lista da tela. Dentro do aoFormSubmetido existe evento, singular.

const evento = {
  capa: formData.get('capa'),
  tema: temas.find(/* ... */),
  data: new Date(formData.get('dataEvento')),
  titulo: formData.get('nomeEvento')
}

E, mesmo que tivessem o mesmo nome, não teria conflito. Arquivos diferentes, funções diferentes. const dentro de uma função só existe ali dentro.

Isso é escopo. JavaScript, não React.

O objeto em si é temporário: junta o que o usuário preencheu, nasce no submit, é entregue pro App pela prop aoSubmeter e some. Quem guarda os eventos de verdade é o eventos lá no App.

O "item, tema, item, tema"

Esse é o map. E o nome da variável atrapalhou mais do que ajudou.

{itens.map(function (item) {
  return <option key={item.id} value={item.id}>{item.nome}</option>
})}

item não tem nada de especial. É só o nome que eu dei pra cada elemento enquanto o map percorre o array. Podia ser tema, t, banana.

Como o array que chega é o de temas, cada item é um objeto tipo { id: 1, nome: 'front-end' }.

Troca o nome e vê que nada muda:

{itens.map(function (tema) {
  return <option key={tema.id} value={tema.id}>{tema.nome}</option>
})}

Mesmo código. O map pega um array de objetos e devolve um array de <option>.

O { itens, ...rest }

Outro que passou rápido.

export function ListaSuspensa({ itens, ...rest }) {

Lê assim: pega a prop itens, joga todo o resto num objeto chamado rest.

Quando o formulário faz <ListaSuspensa id="tema" name="tema" itens={temas} />, o itens fica com o array e o rest fica com { id: "tema", name: "tema" }.

O {...rest} no select faz o caminho de volta: espalha isso como atributo. Mesma coisa que escrever <select id="tema" name="tema"> na mão.

Guarda esse name. Ele volta já já.

O FormData não é React

Esse é o que mais te confundiu, e o mais fácil de resolver.

FormData é API de navegador. Existe há anos, muito antes do React. Ela pega os dados de um formulário e te dá um .get() pra buscar valor pelo name do campo.

O que o React 19 trouxe foi poder passar uma função direto no action do form. Você faz isso, ele intercepta o submit, monta o FormData e chama a sua função com ele pronto.

<form className="form-evento" action={aoFormSubmetido}>

Tem mais coisa junto — ele limpa o form depois do submit, e conversa com useActionState e useFormStatus pra estado de carregamento. Mas pro que interessa aqui, é isso.

E é por isso que os name importam. formData.get('nomeEvento') funciona porque o input tem name='nomeEvento'. O formData.get('tema') funciona porque o select recebeu name="tema" via ...rest.

Por que tem um find no meio

tema: temas.find(function (item) {
  return item.id == formData.get('tema')
}),

Formulário HTML só devolve texto. O select te entrega "3", string, não o tema inteiro.

Só que o card precisa do objeto completo pra mostrar evento.tema.nome. O find percorre os temas e devolve o primeiro cujo id corresponde.

O == no lugar do === é de propósito, pra comparar "3" com 3 sem converter na mão. Não é descuido.

De novo: find é JS puro. Roda num Node sem React nenhum.

Aí sim, o React

function adicionarEvento(evento) {
  setEventos([...eventos, evento])
}

Aqui o estado entra. O formulário montou o objeto temporário e entregou pro App pela prop aoSubmeter.

Essa função cria um array novo — os eventos que já existiam, mais o novo — e passa pro setEventos, que agenda uma nova renderização com o valor atualizado.

Repara no eventos.push comentado logo acima. Deixei de propósito, é a armadilha clássica.

O push altera o array que já existe, no lugar. Nenhuma renderização acontece, porque você nem chamou o setEventos. E mesmo que chamasse passando o mesmo array, o React compara por referência — array idêntico, nada a fazer.

Por isso o spread. Ele cria array novo, referência nova.

Voltando na sua pergunta

Você perguntou se esse é o melhor projeto pra iniciar em React. Pergunta justa, não vou fugir.

O projeto foi desenhado pra te dar React em algo parecido com código real, e código real tem JavaScript por todo lado. Não dá pra escrever React sem map, sem destructuring, sem transformar array. Essas peças não são o desvio do caminho, elas são o caminho.

Então minha sugestão não é voltar pro useState. É fortalecer a base. E eu sei exatamente onde cada coisa que te travou é ensinada.

JavaScript: aprendendo a programar

Esse é a linguagem em si, do zero.

Lá eu ensino função — o que ela recebe, o que ela devolve, e o tal do escopo. É exatamente o que resolve a sua dúvida do evento versus eventos: quando você entende que uma variável declarada dentro de uma função vive e morre ali, aquela confusão nem chega a acontecer.

Ensino também array e objeto com calma, e depois os métodos de array. O map e o find aparecem lá do jeito certo: primeiro o problema ("eu tenho uma lista e preciso de outra"), depois a ferramenta. Sem JSX no meio, sem componente, sem nada te distraindo.

Tem uma parte de estruturas de dados também, Set e Map, que é onde a ideia de "guardar coisa e buscar coisa" termina de fechar.

Se eu tivesse que escolher uma única coisa desse curso pro seu caso, seria os métodos de array. É de longe o que mais aparece em React.

JavaScript: interatividade e manipulação do DOM

Esse é o JavaScript que faz página funcionar. E é o pulo do gato pro seu caso, por três motivos.

Primeiro: tem uma parte inteira sobre formulários, e o FormData está lá. Em JavaScript puro, sem React nenhum. Você vai ver de onde ele vem, por que o atributo name existe, e por que formulário sempre te devolve texto — que é a razão daquele find no meio do código.

Segundo: tem eventos. addEventListener, o objeto de evento, preventDefault, submit de formulário. Quando isso está resolvido, o action={fn} do React 19 para de parecer mágica e vira o que é: um atalho pra uma coisa que você já sabe fazer na mão.

Terceiro, e esse é o que eu mais gosto: no final tem render functions em vanilla. Você escreve funções que recebem dados e devolvem HTML, e monta a tela a partir de um objeto JavaScript em vez de mexer no DOM direto.

Isso é o modelo mental do React sem o React. Quando você sente na pele a dor de manter isso sincronizado na mão, o React deixa de ser um monte de regra estranha e vira alívio.

Tem DOM, fetch, async e devtools no meio também — e devtools em especial vale muito, porque metade do "travei e fui pra IA" vira "coloquei um breakpoint e vi acontecendo".