Parte tres. ¿Cuándo se vuelve a renderizar React? Así que te prometí que explicaría cuándo sucede esto, así que programamos el re-renderizado, pero ¿cuándo decide React realmente, ok, hemos terminado con la actualización, vamos a volver a renderizar? Así que nuevamente, pongamos un ejemplo. Tenemos un controlador de eventos onclick. Y cada controlador de eventos en React se ejecuta dentro de un lote, lo que significa que cuando llamamos a este onclick, React lo ejecuta dentro de alguna función de lote internamente. Y cada actualización de un hook se encola. Así que la primera vez que llamamos a setCounter, agregará una acción a la cola. La segunda vez que llamamos a setCounter, agregará una acción a la cola. Y después de que la función termine, desencadenará un re-renderizado. Así que probablemente te preguntes, ok, pero ¿qué pasa con las funciones asíncronas? Si llamamos algo asíncrono, entonces la función real se completa antes de llegar al código asíncrono. Así que React realmente no puede saber que estás intentando ejecutar actualizaciones en el estado. No sabe cuándo se completará esta función asíncrona. Así que el lote se completa de inmediato y luego cada llamada a setCounter desencadenará un re-renderizado del componente. Así que en este caso, con una función asíncrona, en realidad volveremos a renderizar el componente dos veces. Así que esto es importante saberlo en caso de que quieras evitar algún tipo de parpadeo en la interfaz de usuario, o si quieres optimizar tus renderizados. Y luego debes saber que esto desencadenará un re-renderizado dos veces. Por lo general, no es un problema, pero ayuda a ser consciente de la diferencia entre funciones síncronas y funciones asíncronas. Y si realmente quieres hacer esto dentro de un lote, puedes llamar a react-dom unstableBatchUpdates. Y esto hará el mismo comportamiento que React hace cuando realmente llamas a un controlador de eventos síncrono. Y cuando llamas a unstableBatchUpdates, solo se renderizará una vez, aunque hayas actualizado el contador dos veces. Lo único es que esta es una función llamada unstable guion algo, obviamente nos disuade de usarla. Pero es bastante seguro usarla si realmente necesitas, porque React, el equipo se da cuenta de que mucha gente la usa y algunas bibliotecas y frameworks la usan. Así que en realidad la declararon no como parte de la API pública, pero no hacen cambios que rompan esta API porque se dan cuenta de que mucha gente la usa. Y también van a admitir en las nuevas versiones de React, actualizaciones en lotes de una manera más estable. Así que el paso adicional es, ¿dónde está el error? Esto es más relevante para versiones anteriores de React, pero muchos de ustedes probablemente todavía las están usando. ¿Cuál es el error con este código? Tenemos un controlador de eventos y llamamos a setstep, pasando una función actualizada y usamos e.target.value. El problema con este código, nuevamente, en versiones anteriores de React, es que estamos usando E, que es un evento, y React recicla los eventos, lo que significa que, y ahora sabemos que esta función actualizada solo se ejecutará durante el próximo re-renderizado, donde React ya podría haber reutilizado el evento sintético que se está utilizando dentro del controlador de eventos. Entonces, la forma de resolver esto es, en primer lugar, actualizar a nuevas versiones de React, cuando no tengas este problema. Y el segundo resultado, si no puedes migrar, es simplemente extraer el valor antes y luego usarlo dentro de la función actualizada, o llamar a persistEvent, que persiste el evento y evita que se vuelva a renderizar. Entonces, para resumir esta parte, React realiza los controladores de eventos en lotes, el código asíncrono no se ejecutará en lotes a menos que usemos actualizaciones en lotes inestables o las nuevas API de React, y los eventos se reciclan, no los uses dentro de las funciones actualizadas en versiones antiguas de React.
Parte 4, ¿qué pasa con los reductores? La respuesta es bastante simple, el reductor es en realidad, el estado, es en realidad un reductor bajo el capó.
Comments