Вопрос проверяет понимание того, что именно запускает ререндер React, и какие способы считаются корректными.
Ререндер React можно инициировать только через его собственные механизмы — чаще всего через setState. Внешний стор сам по себе не может перерисовать компонент, он может лишь уведомить React. Обычно это делается через подписку, внутри которой вызывается setState или используется useSyncExternalStore. Прямого “force update” извне не существует.
Важно сразу зафиксировать границу: внешний код не управляет рендером напрямую.
Самый простой и понятный вариант.
const [, forceRender] = useState(0);
store.subscribe(() => {
forceRender((v) => v + 1);
});
forceRender используется только как триггер.
Данные читаются напрямую из стора.
Рекомендованный способ.
const value = useSyncExternalStore(
store.subscribe,
store.getState
);
React сам управляет подпиской.
Ререндер происходит автоматически при изменениях.
Redux, MobX, Zustand:
Инкапсулируют подписку.
Минимизируют лишние ререндеры.
Предоставляют удобные хуки.
Мутировать объект и ждать рендера.
Пытаться вызвать ререндер “извне React”.
Использовать useRef как реактивное состояние.
Ререндер React можно инициировать только через его state-механизмы, а внешний стор должен лишь корректно уведомлять о своих изменениях.