¿Es posible actualizar las propiedades del objeto setState
?
Algo como:
this.state = {
jasper: { name: 'jasper', age: 28 },
}
Yo he tratado:
this.setState({jasper.name: 'someOtherName'});
y esto:
this.setState({jasper: {name: 'someothername'}})
El primero produce un error de sintaxis y el segundo simplemente no hace nada. ¿Algunas ideas?
age
propiedad dentrojasper
.Respuestas:
Hay varias formas de hacerlo, ya que la actualización de estado es una operación asíncrona , por lo que para actualizar el objeto de estado, necesitamos usar la función de actualización con
setState
.1- El más simple:
Primero cree una copia de
jasper
luego haga los cambios en eso:En lugar de usar
Object.assign
, también podemos escribirlo así:2- Uso del operador de propagación :
Nota:
Object.assign
ySpread Operator
crea solo una copia superficial , por lo que si ha definido un objeto anidado o una matriz de objetos, necesita un enfoque diferente.Actualizando objeto de estado anidado:
Suponga que ha definido el estado como:
Para actualizar el objeto extraCheese of pizza:
Actualización de matriz de objetos:
Supongamos que tiene una aplicación de tareas pendientes y está administrando los datos de esta forma:
Para actualizar el estado de cualquier objeto de tareas pendientes, ejecute un mapa en la matriz y verifique si hay algún valor único de cada objeto, en caso de que
condition=true
devuelva el nuevo objeto con valor actualizado, de lo contrario, el mismo objeto.Sugerencia: si el objeto no tiene un valor único, utilice el índice de matriz.
fuente
jasper
objeto,console.log(jasper)
verás solo una clavename
, la edad no estará allí :)jasper
es unobject
, no sé si es mejor o no, puede haber otras soluciones posibles :)Object.assign
ni el operador de propagación ni las propiedades de copia profunda. De esta manera, debe usar soluciones alternativas como lodash,deepCopy
etc.let { jasper } = this.state
?Esta es la forma más rápida y fácil de leer:
Incluso si
this.state.jasper
ya contiene una propiedad de nombre,name: 'someothername'
se utilizará el nuevo nombre .fuente
this.state.jasper
, no necesariamente contiene el último estado. Mejor use la notación con elprevState
.Use el operador de propagación y algunos ES6 aquí
fuente
Usé esta solución.
Si tiene un estado anidado como este:
puede declarar la función handleChange que copia el estado actual y la reasigna con valores cambiados
aquí el html con el oyente de eventos. Asegúrese de utilizar el mismo nombre utilizado en el objeto de estado (en este caso, 'nombreDeAmigo')
fuente
statusCopy.formInputs[inputName] = inputValue;
Sé que hay muchas respuestas aquí, pero me sorprende que ninguna de ellas cree una copia del nuevo objeto fuera de setState, y luego simplemente setState ({newObject}). Limpio, conciso y confiable. Entonces en este caso:
O para una propiedad dinámica (muy útil para formularios)
fuente
prueba esto, debería funcionar bien
fuente
Object.assign({}, this.state.jasper, {name:'someOtherName'})
El primer caso es de hecho un error de sintaxis.
Como no puedo ver el resto de su componente, es difícil ver por qué está anidando objetos en su estado aquí. No es una buena idea anidar objetos en estado componente. Intente configurar su estado inicial para que sea:
De esa manera, si desea actualizar el nombre, simplemente puede llamar:
¿Logrará eso lo que busca?
Para almacenes de datos más grandes y complejos, usaría algo como Redux. Pero eso es mucho más avanzado.
La regla general con el estado del componente es usarlo solo para administrar el estado de la interfaz de usuario del componente (por ejemplo, activo, temporizadores, etc.)
Echa un vistazo a estas referencias:
fuente
Otra opción: defina su variable fuera del objeto Jasper y luego simplemente llame a una variable.
Operador extendido: ES6
fuente
Forma simple y dinámica.
Esto hará el trabajo, pero debe establecer todos los identificadores para el padre para que apunte al nombre del objeto, siendo id = "jasper" y nombre el nombre del elemento de entrada = propiedad dentro del objeto jasper .
fuente
Puede intentar con esto : ( Nota : nombre de la etiqueta de entrada === campo del objeto)
fuente
Esta es otra solución que utiliza la utilidad immer immutabe, muy adecuada para objetos anidados profundamente con facilidad, y no debe preocuparse por la mutación
fuente
Además, siguiendo la solución de Alberto Piras, si no desea copiar todo el objeto "estado":
fuente
Puedes probar con esto:
o para otra propiedad:
O puede usar la función handleChage:
y código HTML:
fuente
Sin usar Async y Await Use esto ...
Si usa Async And Await, use esto ...
fuente
Esta configuración funcionó para mí:
fuente