Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Valores passados como undefined; Cards em Branco

Na aula 4.6, consegui fazer o card aparecer com minhas informações fixas (e também ao cadastrar um novo colaborador com as minhas informações fixas direto no componente Colaborador). Entretanto, após fazer a modificação para cadastrar colaboradores dinamicamente, todos os cards que crio aparecem vazios. Observando o console.log dentro da função aoNovoColaboradorAdicionado (Componente App), vi que todos os parâmetros estão sendo recebidos como undefined. Apesar disto, não consegui solucionar o erro. Seguem meus códigos:

import { useState } from 'react';
import Banner from './componentes/Banner';
import Formulario from './componentes/Formulario';
import Time from './componentes/Time';
import Colaborador from './componentes/Colaborador';

function App() {      
        
  const times = [
    {
      nome: 'Programação',
      corPrimaria: '#75C278',
      corSecundaria: '#D9F7E9'
    },
    {
      nome: 'Front-End',
      corPrimaria: '#82CFFA',
      corSecundaria: '#E8F8FF'
    },
    {
      nome: 'Data Science',
      corPrimaria: '#A6D157',
      corSecundaria: '#F0F8E2'
    },
    {
      nome: 'Devops',
      corPrimaria: '#E06B69',
      corSecundaria: '#FDE7E8'
    },
    {
      nome: 'UX e Design',
      corPrimaria: '#DB6EBF',
      corSecundaria: '#FAE9F5'
    },
    {
      nome: 'Mobile',
      corPrimaria: '#FFBA05',
      corSecundaria: '#FFF5D9'
    },
    {
      nome: 'Inovação e Gestão',
      corPrimaria: '#FF8A29',
      corSecundaria: '#FFEEDF'
    }
  ]

  /*
  O useState é uma ferramenta específica do React para gerenciar estados, permitindo que um componente reaja a mudanças no estado e se renderize novamente. Pode, por exemplo, ser utilizado para modificar o estado de campo no ciclo de vida do React, enquanto uma let pode apenas ser utilizada para armazenar um valor a uma variável, sem mudar a renderização do componente.
  */
  const [colaboradores, setColaboradores] = useState([]); 

  const aoNovoColaboradorAdicionado = (colaborador) => {
    console.log(colaborador.nome, colaborador.cargo, colaborador.imagem);
    //Setando o estado como a lista de todos os colaboradores junto ao novo colaborador
    setColaboradores([...colaboradores, colaborador]);
  }

  return (
    <div className="App">
      <Banner/>
      <Formulario times={times.map(time => time.nome)} aoColaboradorCadastrado={colaborador => aoNovoColaboradorAdicionado(colaborador)}/>
      {times.map(time => <Time key={time.nome} nome={time.nome} corPrimaria={time.corPrimaria} 
      corSecundaria={time.corSecundaria} colaboradores={colaboradores.filter(colaborador => Colaborador.time === time.nome)} />)};
    </div>
  );
}

export default App;
2 respostas
import CampoTexto from '../CampoTexto';
import ListaSuspensa from '../ListaSuspensa';
import Botao from '../Botao';
import './Formulario.css';
import { useState } from 'react';

const Formulario = (props) => {
    const times = [
        'Programação',
        'Front-End',
        'Data Science',
        'Devops',
        'UX e Design',
        'Mobile',
        'Inovação e Gestão'
    ];

    /*
    O useState é uma ferramenta específica do React para gerenciar estados, permitindo que um componente reaja a mudanças no estado e se renderize novamente. Pode, por exemplo, ser utilizado para modificar o estado de campo no ciclo de vida do React, enquanto uma let pode apenas ser utilizada para armazenar um valor a uma variável, sem mudar a renderização do componente.
    */
    const [nome, setNome] = useState('');
    const [cargo, setCargo] = useState('');
    const [imagem, setImagem] = useState('');
    const [time, setTime] = useState('');
    
    const aoSalvar = (evento) => {
        evento.preventDefault();
        //console.log('Form foi submetido => ', nome, cargo, imagem, time);
        props.aoColaboradorCadastrado(nome, cargo, imagem, time);
    }

    /* Função no submit do formulário
    É buscado onSubmit ao invés do click do botão pois assim pode-se fazer as verificações
    dos campos do formulário
    */
    /* Outra forma de passar parâmetros para o componente */
    return (
        <section  className="formulario">
            <form onSubmit={aoSalvar}>
                <h2>Preencha os dados para criar o card do colaborador</h2>
                <CampoTexto obrigatorio="true" label="Nome" placeholder="Digite seu nome"
                valor={nome} aoAlterado={valor => setNome(valor)}/>
                <CampoTexto obrigatorio="true" label="Cargo" placeholder="Digite seu cargo"
                valor={cargo} aoAlterado={valor => setCargo(valor)}/>
                <CampoTexto label="Imagem" placeholder="Digite o endereço da imagem"
                valor={imagem} aoAlterado={valor => setImagem(valor)}/>
                <ListaSuspensa label="Time" itens={props.times}
                valor={time} aoAlterado={valor => setTime(valor)}/>   
                <Botao texto="Criar Card">
                    Criar Card
                </Botao>
            </form>
        </section>
    )
}

export default Formulario
import Colaborador from '../Colaborador';
import './Time.css';

const Time = (props) => {
    const css = { backgroundColor: props.corSecundaria };

    return (
        <section className='time' style={ css }>
            <h3 style={{ borderColor: props.corPrimaria }}>{props.nome}</h3>
            <div className='colaboradores'>
                {props.colaboradores.map(colaborador => <Colaborador 
                nome={colaborador.nome} cargo={colaborador.cargo} imagem={colaborador.imagem}
                />)}
            </div>
        </section>
    )
}

export default Time;
import './Colaborador.css'

const Colaborador = ({nome,imagem,cargo}) => {

    return (
        <div className='colaborador'>
            <div className='cabecalho'>
                <img src={imagem} alt={nome}/>
            </div>
            <div className='rodape'>
                <h4>{nome}</h4>
                <h5>{cargo}</h5>
            </div>
        </div>
    );

}

export default Colaborador;
solução!

Caso alguém enfrente o mesmo problema que eu, encontrei qual era o erro:

Dentro da constante aoSalvar (index.js do Formulario), faltou eu colocar os parâmetros passados entre chaves ("{}"):

const aoSalvar = (evento) => {
        evento.preventDefault();
        //console.log('Form foi submetido => ', nome, cargo, imagem, time);
        props.aoColaboradorCadastrado({nome, cargo, imagem, time});
    }