Cuando cambia el estado de un componente de reacción, se llama al método de representación. Por lo tanto, para cualquier cambio de estado, se puede realizar una acción en el cuerpo de los métodos de representación. ¿Hay un caso de uso particular para la devolución de llamada setState entonces?
191
render()
, se ejecutará cada vez que se actualice CUALQUIER estado, lo que probablemente no sea lo que desea. Esto también hará que su código sea menos legible y lógico.Respuestas:
Sí lo hay, ya que
setState
funciona de algunaasynchronous
manera. Eso significa que después de llamar asetState
lathis.state
variable no se cambia de inmediato. así que si desea realizar una acción inmediatamente después de establecer el estado en una variable de estado y luego devolver un resultado, una devolución de llamada será útilConsidere el siguiente ejemplo
Es posible que el código anterior no funcione como se esperaba, ya que la
title
variable puede no haber mutado antes de que se realice la validación. Ahora puede preguntarse si podemos realizar la validación en larender()
función en sí, pero sería mejor y más limpio si podemos manejar esto en la función changeTitle, ya que eso haría que su código sea más organizado y comprensibleEn este caso, la devolución de llamada es útil
Otro ejemplo será cuando quieras
dispatch
y acción cuando el estado haya cambiado. querrá hacerlo en una devolución de llamada y no en larender()
forma en que se llamará cada vez que se produzca la devolución y, por lo tanto, muchos de estos escenarios son posibles donde necesitará una devolución de llamada.Otro caso es un
API Call
Puede surgir un caso cuando necesita hacer una llamada a la API en función de un cambio de estado particular, si lo hace en el método de representación, se llamará en cada
onState
cambio de representación o porque alguna Prop se transfirió a laChild Component
modificación.En este caso, querrá usar a
setState callback
para pasar el valor de estado actualizado a la llamada APIfuente
if (this.title.length === 0) {
debería serthis.state.title.length
, ¿verdad?setState(state => state.title.length ? { titleError: "Title can't be blank" } : null)
y el cambio se acumulará. No se requieren dobles renders.fuente
1. El caso de uso que viene a mi mente, es una
api
llamada, que no debería entrar en el render, porque se ejecutará para uneach
cambio de estado. Y la llamada a la API solo debe realizarse en un cambio de estado especial, y no en cada render.Muy mala práctica , debido a que el
render
método-debe ser puro, significa que no se deben realizar acciones, cambios de estado, llamadas a la API, solo componga su vista y devuélvala. Las acciones deben realizarse solo en algunos eventos. Render no es un evento, sinocomponentDidMount
por ejemplo.fuente
Considere la llamada setState
IDEA
Por lo tanto, no puede confiar
this
. Si la llamada anterior se realizó dentro de una función asincrónica,this
se referirá al estado del componente en ese punto de tiempo, pero esperábamos que esto se refiriera a la propiedad dentro del estado en la llamada setState del tiempo o al comienzo de la tarea asincrónica. Y como la tarea era llamada asincrónica, esa propiedad puede haber cambiado con el tiempo. Por lo tanto, no es confiable usarthis
palabras clave para referirse a alguna propiedad de estado, por lo tanto, usamos la función de devolución de llamada cuyos argumentos son anteriorState y props, lo que significa que cuando se realizó la tarea asincrónica y que era hora de actualizar el estado usando setState, la llamada anteriorState se referirá al estado ahora cuando setState aún no ha comenzado Garantizar la fiabilidad de que nextState no se corromperá.Código incorrecto: conduciría a la corrupción de datos
Código correcto con setState con función de devolución de llamada:
Por lo tanto, cada vez que necesitemos actualizar nuestro estado actual al siguiente estado en función del valor presentado por la propiedad en este momento y todo esto está sucediendo de manera asíncrona, es una buena idea usar setState como función de devolución de llamada.
He tratado de explicarlo en codepen aquí CODE PEN
fuente