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

199
Views
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 answers
Answer question

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 Report

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 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!