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

198
Vistas
Obtener los valores iniciales de la lista useState al regresar de un subcomponente para guardar datos en lugar del estado actual

He recreado mi problema en un ejemplo de código simplificado. Sigue estos pasos para reproducirlo:

  1. Haga clic en uno de los tres elementos de la lista para editar el valor en el cuadro fuera del lienzo.
  2. Cambie el valor y haga clic en el botón Guardar.
  3. Seleccione un elemento diferente para editar y guardar.
  4. Nota: el elemento editado original ha vuelto a su estado inicial. Tengo el console.logging en el método de guardar para mostrar que la lista (estado) no es la versión actual (visible) sino el estado inicial.

Ejemplo de código de caja de arena

Tengo una solución poco elegante (solución alternativa) que pondré como respuesta, pero no explica qué o por qué sucede esto. Tengo 3 editores fuera del lienzo como este en mi página y uno funciona como se esperaba, pero los otros dos pierden el estado al llamar a sus funciones de guardado en el padre.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Aquí está mi mala (fea) solución:

  1. Pase el objeto de estado (myList) al elemento secundario en el objeto de accesorios.

Aplicación.js

 function open(e, item, itemIndex) { setPropArgs({ ...propArgs, editThis: item, index: itemIndex, show: true, itemList: myList }); }
  1. Devuelva la lista al padre en la llamada al método de guardado y use la variable pasada en lugar del estado.

MiEditor.js

 <Button type="button" onClick={(e) => props.save(edit, props.index, props.itemList)}> Save </Button>

Aplicación.js

 function save(edit, index, itemList) { // console.log(myList); const newList = [...itemList]; newList[index] = edit; setMyList(newList); setPropArgs({ ...propArgs, show: false }); }

Esto es malo porque MyEditor no debería necesitar saber nada sobre el padre, no lee ni edita la lista en absoluto y no debería ser necesario pasar una copia del estado que podría quedar desactualizado ( si no estuviera bloqueando con la lona).

about 4 years ago · Juan Pablo Isaza Denunciar

0

Vale... Encontré la respuesta que estaba buscando. Gracias a Marco Nisi por esta respuesta a una pregunta muy similar que no ha recibido mucha atención.

Mi solución de código bifurcado aquí

La solución es mover la devolución de llamada (función de guardar) para que se cree cuando se muestra el lienzo en lugar de cuando se inicializa el componente funcional, creando un clon más reciente del estado. Todavía puedo ver que esto es problemático si tiene un ejemplo en el que el estado se actualiza en segundo plano o si el lienzo fuera del lienzo no bloquea otras ediciones. Nota: no necesita la devolución de llamada definida en la función abierta, pero sí debe agregarse (reemplazarse) al objeto de accesorios allí.

 function open(e, item, itemIndex) { save = (edit, index) => { console.log(myList); const newList = [...myList]; newList[index] = edit; setMyList(newList); setPropArgs({ ...propArgs, show: false }); }; setPropArgs({ ...propArgs, editThis: item, index: itemIndex, show: true, save: save }); }
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