Получи случайную криптовалюту за регистрацию!

Решил тут на днях обновиться до свежего React 18, потому что в | Типа про IT

Решил тут на днях обновиться до свежего React 18, потому что в мире клиентской логики за такими вещами лучше следить, иначе окажешься в ситуации, когда переписывать надо вообще всё. Хотя, в любом случае окажешься, но не так быстро.

В новом релизе они решили поменять способ установки корневого контейнера (или как это по-рюсски?)

// Было
import { render } from ‘react-dom’;
import App from './App'
const container = document.getElementById('root')
ReactDOM.render(
,
contaner,
)

// Стало
import { createRoot } from 'react-dom/client';
import App from './App'
const container = document.getElementById('root')
const root = createRoot(container!)
root.render(

Во время рефакторинга я обновил “в том числе и это”, а потом целый час дебажил почему все actions во всём проекте стали вызываться по два раза.

А потому что upgrade notes надо читать внимательнее:

In React 18, StrictMode gets an additional behavior to ensure it’s compatible with reusable state. When Strict Mode is enabled, React intentionally double-invokes effects (mount -> unmount -> mount) for newly mounted components. А в компонентах что? useEffect, а в useEffect дёргается dispatch и API.

Такое поведение наблюдается только в development mode и только с использованием StrictMode. Они называют это фичей, которая помогает отлавливать баги и форсит использование pure functions. Я же в гробу видал такое поведение, поэтому убираем StrictMode из корня и живём нормальной жизнью root.render()

Заебали всё ломать.