En el componente funcional de reacción, los documentos especifican que actualizar el estado a un valor idéntico al estado anterior no provocará una nueva representación ( https://reactjs.org/docs/hooks-reference.html#bailing-out-of- una actualización de estado )
Si actualiza un State Hook al mismo valor que el estado actual, React se rescatará sin renderizar a los niños ni disparar efectos. (React usa el algoritmo de comparación Object.is).
En este fragmento de código aquí -
const App = () => { const [resourceType, setResourceType] = useState('posts'); console.log('abc'); return ( <> <button onClick={() => setResourceType('posts')}>posts</button> <button onClick={() => setResourceType('users')}>users</button> <button onClick={() => setResourceType('comments')}>comments</button> <h2>{resourceType}</h2> </> ); } Cuando sigo haciendo clic en diferentes botones, puedo ver abc para cada clic de botón diferente en la consola, lo cual es correcto ya que el tipo de resourceType se cambia y la página se vuelve a representar. Sin embargo, cuando hago clic en el mismo botón por segunda vez, todavía puedo ver que el abc se registra en la consola, lo cual es extraño, ya que los documentos mencionan que establecer el mismo valor que el estado actual no provocará que se vuelva a procesar.
Y para mi asombro cuando hago clic en el mismo botón tres o más veces, el abc ya no se registra como si alguien le dijera que no es su turno. ¿Alguien puede ayudarme con ese comportamiento de reaccionar?
En el siguiente comentario de un desarrollador de Facebook, se encuentra una explicación de por qué puede obtener un renderizado al configurar el estado con el mismo valor exacto que el anterior.
El problema que vinculé explica un problema similar en el que hacer clic en un botón que establece el estado en el mismo valor da como resultado una nueva representación en el primer y segundo clic, y no en el tercero. La razón por la que el renderizado ocurre dos veces es que:
Esta es una peculiaridad conocida debido a los detalles de implementación de la concurrencia en React. No sabemos a bajo precio cuál de las dos versiones está comprometida actualmente. Cuando ocurre esta ambigüedad, tenemos que renderizar una vez y luego sabemos que ambas versiones son iguales y no importa.