Не плутайте форму даних із формою стану

Коли ви створюєте форму на React, ви часто групуєте все в один великий об'єкт стану.

Ви бачите розділ «Адреса» у своєму інтерфейсі. Ви створюєте об'єкт адреси у своєму стані. Це виглядає організовано. Це виглядає охайно.

Це пастка.

Проблема не в React. Проблема у формі вашого стану.

Форми — це не статичні дані. Це інтерактивні системи. Користувачі не оновлюють форми розділ за розділом. Вони оновлюють їх поле за полем.

Чому вкладений стан шкодить вашому проєкту:

  • Оновлення стають важкими. Щоб змінити лише назву міста, вам потрібно заново створити об'єкт міста, об'єкт адреси та об'єкт форми верхнього рівня, щоб зберегти незмінність (immutability).
  • Складність розповсюджується. У міру зростання форми вашу логіку валідації та рендерингу стає дедалі важче контролювати.
  • Збільшується кількість ререндерів. Зміна одного вкладеного значення створює нові посилання на об'єкти. Це може спричинити непотрібні оновлення в усій дереві компонентів.
  • Зростає когнітивне навантаження. Ви перестаєте думати про користувача і починаєте думати про шляхи до об'єктів.

Малі форми прощають помилки. Продуктові форми — ні.

Продуктивна форма потребує валідації, автозбереження та умовної логіки. Якщо ви будуєте це на основі глибоко вкладеного об'єкта, кожна нова функція здаватиметься «дорогою» у реалізації.

Рішення полягає в тому, щоб проєктувати стан навколо того, як змінюються дані, а не того, як вони виглядають.

Більш пласка форма стану дає такі переваги:

  • Швидші оновлення. Ви змінюєте менше коду для оновлення одного значення.
  • Простіше налагодження. Оновлення залишаються локальними та передбачуваними.
  • Кращі межі компонентів. Ви можете передавати невеликі фрагменти даних замість величезних об'єктів.

Не робіть усе пласким наосліп. Якщо дані змінюються рідко і завжди рухаються разом, вкладеність — це нормально. Але не робіть вкладеними ті частини форми, які змінюються постійно.

Поставте собі ці запитання перед тим, як писати код:

  • Які поля змінюються найчастіше?
  • Які розділи потребують незалежної валідації?
  • Які оновлення мають залишатися ізольованими від решти інтерфейсу?

Якщо оновлення одного поля здається складнішим, ніж саме змінення, то проблема у структурі вашого стану.

Припиніть моделювати стан за зразком вашого інтерфейсу. Почніть моделювати його за зразком поведінки вашого користувача.

Джерело: https://dev.to/hardik_kuwar_7caa4626bb16/the-mistake-is-assuming-data-shape-and-state-shape-should-always-match-5g0e