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

Problema com

Está aparecendo um erro no meu console que não consigo resolver. Aparece um aviso sobre um problema com keyprop, alem disso, não consigo adicionar mais de uma pessoa no mesmo time. Vou deixar os códigos de App, Time e ListaSuspensa, caso alguém possa me ajudar e precise de mais algum código, estou deixando o link do github do projetohttps://github.com/nayara-al/organo

Neste exemplo abaixo tentei cadastrar as duas pessoas no time de "front-end". Insira aqui a descrição dessa imagem para ajudar na acessibilidade

App.js

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

function App() {

  const times=[
    {
      nome:'Programação',
      corPrimaria:'#57C278' ,
      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'
    }
  ]

  const [colaboradores, setColaboradores] = useState([])

  const aoNovoColaboradorAdicionado = (colaborador) => {
    console.log(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)}
      />)}  
        <Rodape/>
    </div>
  );
}

export default App; 

Time - index.js

import Colaborador from '../Colaborador'
import './Time.css'

const Time = (props) => {
    return (
        props.colaboradores.length > 0 && 
        <section className="time" style={{backgroundColor: props.corSecundaria}}>
            <h3 style={{borderColor: props.corPrimaria, color: props.corPrimaria}}>{props.nome}</h3>
            <div className='colaboradores'>
                {props.colaboradores.map( colaborador => <Colaborador
                    nome={colaborador.nome}
                    cargo={colaborador.cargo}
                    imagem={colaborador.imagem}/>)}
            </div>          
           {/* <Colaborador/> */}
        </section>
    )
}

export default Time

Lista suspensa - index.js

import './ListaSuspensa.css'

const ListaSuspensa = (props) => {
    return (
        <div className='lista-suspensa'>
            <label>{props.label}</label>
            <select onChange={evento => props.aoAlterado(evento.target.value)} required={props.required} value={props.value}>
                {props.itens.map(item => {
                    return <option key={item}>{item}</option>
                })}
            </select>
        </div>
    )
}

export default ListaSuspensa
2 respostas
solução!

Prop key

Como você está usando o nome do time na propriedade key você não poderá repetir nome

Assim como o erro fala essa propriedade deve ser única para cada filho (cada time deve ter um identificador próprio)

O ideal seria que cada time tivesse um id

{
  id: 1
  nome:'Programação',
  corPrimaria:'#57C278' ,
  corSecundaria:'#D9F7E9' 
}

Mas voce pode também utilizar o index da lista

{times.map((time, index) => <Time 
  key={index} 
  nome={time.nome} 
  corPrimaria={time.corPrimaria} 
  corSecundaria={time.corSecundaria} 
  colaboradores={colaboradores.filter(colaborador => colaborador.time === time.nome)}
/>)} 

utilizar o id ajuda mais ao react renderizar a lista de forma otimizada

Não é possível adicionar mais de um colaborador

Analisando a função que adiciona colaboradores

const aoNovoColaboradorAdicionado = (colaborador) => {
    console.log(colaborador)
    setColaboradores([...colaboradores, colaborador])
}

Como você está utilizando a variável colaboradores, o problema é que quando a função é criada colaboradores é igual à [] E como ela não é recriada caso esta variável(colaboradores) mude, a função vai se comportar como se a lista estivesse vazia sempre Como concertar isso? Utilize o useCallback do próprio react, do seguinte jeito

import {userState, useCallback} from 'react'; # nao esqueca de importar
...
const aoNovoColaboradorAdicionado = useCallback((colaborador) => {
    console.log(colaborador)
    setColaboradores([...colaboradores, colaborador])
}, [colaboradores, setColaboradores]);

Como pode ver, coloquei as variáveis colaboradores e setColaboradores em um array que é o segundo argumento do useCallback Isso fala ao useCallback que ele depende dessas variáveis externas e deve ser atualizado quando elas mudam

Muito obrigada pela ajuda! Consegui entender tudo, muito bem explicado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software