Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

128
Vistas
PrevProps dando el mismo valor que los accesorios

Tengo un componente de scene que asigno a una matriz de objetos en el editor .

Y estoy pasando el objeto de scene como accesorios para cada escena, y quería obtener la scene anterior cuando presiono un button .

Pero cuando los comparo en la consola son iguales.

Usé ganchos useRef y useEffect para obtener prevProps

código para el editor :

 const scene = { jsonObj: null, }; const [scenes, setScenes] = useState([scene]); useEffect(() => { }, []); const switchScene = (scene, prevScene) => { const JsonObj = canvas.setJsonObj(); console.log(JsonObj); const index = scenes.indexOf(scene); canvas.resetEditor(); const prevIndex = scenes.indexOf(prevScene); console.log(prevIndex, index); let cpScenes = [...scenes]; cpScenes[prevIndex].jsonObj = JSON.stringify(JsonObj); setScenes(cpScenes); cpScenes = [...scenes]; cpScenes[index].jsonObj = JsonObj; setScenes(cpScenes); canvas.loadJson(scene.JsonObj); console.log(scene); console.log(prevScene); }; return( <div> {scenes.map((scene, i) => ( <Scene key={i * Math.floor(Math.random() * 100)} addText="Scene" onDelete={removeScene} scene={scene} switchScene={(scene, prevScene) => { setUpdate(Math.floor(Math.random() * 100)); switchScene(scene, prevScene); }} /> ))} );

código de la scene :

 import React, { useEffect, useRef, useState } from "react"; import _uniqueId from "lodash/uniqueId"; function Scene(props) { const id = useState(_uniqueId("sceneCmpn-")); const prevScene = useRef(props.scene); useEffect(() => { prevScene.current = props.scene; }, [props.Scene]); return ( <div key={id}> <button id={id} onClick={() => { props.switchScene(props.scene, prevScene.current); }} > Scene </button> <button onClick={() => props.onDelete(props.scene)} className="btn btn-danger m-2" > remove scene </button> </div> ); } export default Scene;
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Creo que la forma en que funciona el gancho usePrevious es devolviendo un valor obsoleto: useEffect solo se llama después de que el valor se actualiza dentro del gancho (creo).

Creo que el problema de tener onClick es el siguiente:

 onClick={() => { props.switchScene(props.scene, prevScene.current); }}

Es que useEffect actualizará prevScene antes de que se maneje el clic (por lo que devolverá el mismo valor para props.scene, prevScene.current ).

En lugar de integrar esa funcionalidad dentro de su componente, creo que podría hacer que funcione usando el gancho por separado.

Probé tu enfoque inicial con un ejemplo simple con un contador:

 function Switcher(value) { const ref = useRef(); useEffect(() => { ref.current = value; }, [value]); const onClick = () => { console.log(value, ref.current); }; return <button onClick={onClick}> LOG </button>; } export default Switcher;

En este caso, hacer clic en el botón no funcionó como se esperaba, arrojó el mismo valor para value y valor previousValue :

ingrese la descripción de la imagen aquí

Sin embargo, esto podría solucionarse separando el gancho:

 function Switcher(value) { const prevValue = usePrev(value); const onClick = () => { console.log(value, prevValue); }; return <button onClick={onClick}> LOG </button>; } export default Switcher;

Aquí está la salida de la consola:

ingrese la descripción de la imagen aquí

Puedes encontrar la caja de arenaaquí

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda