Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

126
Visualizações
React update array prop de niño a padre

Hola, tengo dificultades para actualizar correctamente mi estado de mi componente secundario a mi componente principal. Básicamente, estoy tratando de establecer el estado actual en true onclick.

Este es mi componente principal:

 export default function Layout({ children }: Props) { const [navigation, setNavigation] = useState([ { name: 'Dashboard', href: '/', icon: HomeIcon, current: true }, { name: 'Create Fact', href: '/facts/create', icon: UsersIcon, current: false }, { name: 'Documents', href: '/documents', icon: InboxIcon, current: false } ]) return ( <> <Sidebar navigation={navigation} setNavigation={setNavigation} />

Este es mi componente secundario (barra lateral)

 type Props = { navigation: Array<{ name: string href: string icon: any current: boolean }> setNavigation: ( navigation: Array<{ name: string href: string icon: any current: boolean }> ) => void } const Sidebar = ({navigation, setNavigation}: Props) => { const router = useRouter() const toggleNavigation = (name: string) => { // todo: Here I would like to properly update the state with the current selected navigation item (current) const newNavigation = navigation.map(nav => { if (nav.name === name) { nav.current = true return nav } }) } return ( <nav className="flex-1 px-2 pb-4 space-y-1"> {navigation.map(item => ( <span onClick={() => toggleNavigation(item.name)}
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Hay tres problemas:

  1. Nunca llamas a setNavigation con tu nueva matriz.

  2. No borra el elemento current en el elemento anteriormente actual.

  3. Aunque está creando una nueva matriz, está reutilizando los objetos que contiene, incluso cuando los cambia, lo que va en contra de la regla No modificar el estado directamente .

Para arreglar los tres (ver *** comentarios):

 const toggleNavigation = (name: string) => { const newNavigation = navigation.map(nav => { if (nav.name === name) { // *** #3 Create a *new* object with the updated state nav = {...nav, current: true}; } else if (nav.current) { // *** #2 make the old current no longer current nav = {...nav, current: false}; } return nav; }); // *** #1 Do the call to set the navigation setNavigation(newNavigation); };

Sin embargo, por separado, sugeriría separar la navigation en dos cosas:

  • El conjunto de objetos de navegación.
  • El nombre del elemento de navegación actual.

Luego, configurar el elemento de navegación es simplemente configurar una nueva cadena, no crear una matriz completamente nueva con un objeto actualizado.

about 4 years ago · Juan Pablo Isaza Relatório

0

La solución y la explicación de TJ Crowder son geniales . Además, puede escribir esa lógica en una sintaxis más corta. Solo una preferencia.

 const newNavigation = navigation.map(nav => { return nav.name === name ? { ...nav, current: true } : { ...nav, current: false } })
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda