redux dispatch Вызывает useEffect-ы синхронно до завершения обработчика события

Предположим, что в некотором обработчике события (напр. клика) выполняется несколько разных dispatch().

Если перед очередным вызовом dispatch уже проходил рендериг компонента (вызванный, напр. предыдущим dispatch(), который поменял что-то в стейте, на который этот компонент подписан), после которого не были выполнены useEffect-ы, и сам вызов dispatch() также меняет состояние компонента и приводит к рендерингу, то React (судя по тому что показывает отладка) синхронно выполнит useEffect, относившийся к предыдущему рендерингу.

Отчасти это следуют из того, эффекты должны выполняться перед любым рендерингом, см. в документации:

Хотя useEffect откладывается до тех пор, пока браузер не выполнит отрисовку, он гарантированно срабатывает перед любыми новыми рендерами. React всегда полностью применяет эффекты предыдущего рендера перед началом нового обновления

Примечание:
в случае с dispatch подобного поведения для useEffect можно избежать, если объединять вызовы dispatch (batch), в этом случае, хотя рендеринг (виртуальный) и произойдет после вызова диспатч, но произойдет он только один раз, а значит не будет нужды запускать юзэффекты синхронном между вызовами испетчеризации.