Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
Reaccionar: ¿Cómo solo represento un componente en la página una vez que hago clic en él desde una matriz asignada?

Tengo una cuadrícula de componentes representados en una página usando la función de mapa y solo quiero representar el componente con todos sus detalles una vez que hago clic en él y solo obtengo un error que dice:

TypeError no capturado: no se pueden leer las propiedades de undefined (leyendo 'logo')

Soy nuevo en React y no puedo entender por qué sucede esto.

¡Alguna ayuda sería muy apreciada!

Aquí está mi código:

Componente del cuerpo - (componente principal)

 import { useState } from "react"; import CompanyList from "./CompanyList"; import Company from "./Company"; const Body = ({ companies }) => { const [viewCompany, setViewCompany] = useState(false); const showCompanyHandler = (company) => { console.log("Clicked on company card"); setViewCompany(true); }; return ( <div className="appBody"> <CompanyList companies={companies} showCompanyHandler={showCompanyHandler} /> {viewCompany && <Company />} </div> ); }; export default Body;

Componente CompanyList (hijo de Body)

 import Company from "./Company"; const CompanyList = ({ companies, showCompanyHandler }) => { return ( <div className="companyList"> {companies.map((company) => ( <Company key={company.id} company={company} showCompanyHandler={showCompanyHandler} /> ))} </div> ); }; export default CompanyList;

Componente de empresa (hijo de CompanyList) - Componente que quiero mostrar en la página

 const Company = ({ company, showCompanyHandler }) => { return ( <div className="company" onClick={(company) => showCompanyHandler(company)}> {console.log(company)} <img src={company.logo} alt="logo" /> <h1>{company.name}</h1> <p>{company.companyDescription}</p> </div> ); }; export default Company;

No estoy seguro de lo que me estoy perdiendo aquí...

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Si el componente CompanyList funciona bien, una forma fácil de hacerlo sería usar una función para generar dinámicamente la lista en lugar de tener una referencia directa al componente.

 import { useState } from "react"; import CompanyList from "./CompanyList"; import Company from "./Company"; const Body = ({ companies }) => { const [viewCompany, setViewCompany] = useState(false); const showCompanyHandler = () => { console.log("Clicked on company card"); setViewCompany(true); }; // I removed the showCompanyHandler attribute and // added an onClick to CompanyListContainer, instead. const generateCompanyList = (companies) => { if (viewCompany === false) return null; return <CompanyList companies={companies} /> ) } return ( <div className="appBody"> <CompanyListContainer onClick={showCompanyHandler}> {generateCompanyList} </CompanyList> </div> ); }; export default Body;

Si generarCompanyList es nulo, lamentablemente no debería haber nada en lo que hacer clic. Por lo tanto, puede agregarle algunos estilos al div para un ancho/alto mínimo, o puede mover eso onClick a su componente appBody.

about 4 years ago · Juan Pablo Isaza Report

0

Si entendí correctamente, la estructura de su código está rota y necesita refactorizarla para implementar el tipo de lógica que está buscando.

En primer lugar, le sugiero que elimine este {viewCompany && <Company />} , viewCompany y showCompanyHandler de su componente Body.

Dado que el componente Company siempre estará visible, en mi opinión, debería ser responsable de manejar esta lógica de "expansión" que está tratando de implementar, algo como:

 const Company = ({ company }) => { const [showDetails, setShowDetails] = useState(false); const toggleShowDetails = () => setShowDetails(!showDetails); return ( <div className="company" onClick={toggleShowDetails}> {showDetails && <> <img src={company.logo} alt="logo" /> <h1>{company.name}</h1> <p>{company.companyDescription}</p> </> } </div> ); }; export default Company;

Como puede ver, con esta implementación ya no tiene que pasar showCompanyHandler al componente Company y puede eliminar toda esta lógica del componente Body.

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!