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

307
Views
Violación invariable no detectada: se generaron más ganchos que durante el procesamiento anterior

Tengo un componente que se ve así (versión muy simplificada):

 const component = (props: PropTypes) => { const [allResultsVisible, setAllResultsVisible] = useState(false); const renderResults = () => { return ( <section> <p onClick={ setAllResultsVisible(!allResultsVisible) }> More results v </p> { allResultsVisible && <section className="entity-block--hidden-results"> ... </section> } </section> ); }; return <div>{ renderResults() }</div>; }

Cuando cargo la página en la que se usa este componente, aparece este error: Uncaught Invariant Violation: Rendered more hooks than during the previous render. Traté de encontrar una explicación de este error, pero mi búsqueda no arrojó resultados.

Cuando modifico el componente ligeramente:

 const component = (props: PropTypes) => { const [allResultsVisible, setAllResultsVisible] = useState(false); const handleToggle = () => { setAllResultsVisible(!allResultsVisible); } const renderResults = () => { return ( <section> <p onClick={ handleToggle }> More results v </p> { allResultsVisible && <section className="entity-block--hidden-results"> ... </section> } </section> ); }; return <div>{ renderResults() }</div>; }

Ya no me sale ese error. ¿Es porque incluí la función setState dentro del jsx que devuelve renderResults ? Sería genial tener una explicación de por qué funciona la corrección.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

La solución funciona porque la primera muestra de código (la que da error) invoca una función dentro de onClick , mientras que la segunda (la que funciona) pasa una función a onClick . La diferencia son esos paréntesis tan importantes, que en JavaScript significan 'invocar este código'.

Piénselo de esta manera: en la primera muestra de código, cada vez que se procesa el component , se invoca renderResults . Cada vez que eso sucede, setAllResultsVisible(!allResultsVisible) , en lugar de esperar un clic. Dado que React realiza el renderizado en su propio horario, no se sabe cuántas veces sucederá.

De los documentos de React:

Con JSX, pasa una función como controlador de eventos, en lugar de una cadena.

Documentos de eventos de manejo de React

Nota: No pude recibir este mensaje de error exacto cuando ejecuté el primer ejemplo de código en un espacio aislado. Mi error se refería a un bucle infinito. ¿Quizás una versión más reciente de React produce el error descrito?

over 4 years ago · Santiago Trujillo Report

0

Me enfrenté al mismo problema. Lo que estaba haciendo era algo como esto:

 const Table = (listings) => { const {isLoading} = useSelector(state => state.tableReducer); if(isLoading){ return <h1>Loading...</h1> } useEffect(() => { console.log("Run something") }, []) return (<table>{listings}</table>) }

Creo que lo que sucedió fue que en el primer renderizado, el componente regresó temprano y useEffect no se ejecutó. Cuando el estado de isLoading cambió, useEffect se ejecutó y obtuve el error: el enlace se procesó más veces que el procesamiento anterior.

Un simple cambio lo arregló:

 const Table = (listings) => { const {isLoading} = useSelector(state => state.tableReducer); useEffect(() => { console.log("Run something") }, []) if(isLoading){ return <h1>Loading...</h1> } return (<table>{listings}</table>) }
over 4 years ago · Santiago Trujillo Report

0

Simplemente puede cambiar su evento onlick agregar () => antes de setAllResultsVisible

 <p onClick={() => setAllResultsVisible(!allResultsVisible) }> More results v </p>

y funcionará perfectamente

over 4 years ago · Santiago Trujillo 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!