React-Redux: Якщо всі стани компонентів зберігатимуться в Redux Store


89

Скажімо, у мене є простий перемикач:

Коли я натискаю кнопку, компонент Колір змінюється між червоним та синім

Я міг би досягти цього результату, роблячи щось подібне.

index.js

Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red

container.js

connect(mapStateToProps)(indexPage)

action_creator.js

function changeColor(){
 return {type: 'CHANGE_COLOR'}
}

reducer.js

switch(){
case 'CHANGE_COLOR':
return {color: true}

але це надзвичайно багато коду для написання чогось, чого я міг досягти за 5 секунд за допомогою jQuery, деяких класів та деяких css ...

Тож я здогадуюсь, що я насправді запитую, що я тут роблю не так?


6
response-redux не продається як щось коротше, ніж jquery. Безперечно, потрібен певний код для його запуску та запуску.
zerkms

1
Погляньте тут: github.com/rackt/redux/issues/1287 , є багато хороших дискусій на цю тему.
m0meni

1
спасибі @ AR7 це ідеально
l2silver

1
@ l2silver немає проблем. В основному ідея полягає в тому, що якщо колір цього компонента не має значення для когось іншого, просто тримайте цей стан у внутрішньому відношенні до самого компонента.
m0meni

2
згадана проблема AR7 перенесена: github.com/reactjs/redux/issues/1287
ptim

Відповіді:


156

Redux в першу чергу призначений для "стану програми". Тобто все, що пов’язано з логікою вашого додатка. Погляд, побудований поверх нього, є відображенням цього стану, але не повинен використовувати виключно цей контейнер стану для всього, що він робить.

Просто задайте такі запитання: чи важливий цей стан для решти програми? Чи будуть інші частини програми поводитися інакше залежно від цього стану? У багатьох незначних випадках цього не буде. Візьміть спадне меню: той факт, що він відкритий або закритий, ймовірно, не вплине на інші частини програми. Отже, підключити його до вашого магазину, мабуть, надмірно. Це, звичайно, дійсний варіант, але насправді не приносить вам ніяких переваг. Вам краще використовувати this.stateі називати це на день.

У вашому конкретному прикладі, чи перемикається колір цієї кнопки, щоб щось змінити в інших частинах програми? Якщо це якийсь загальний перемикач увімкнення / вимкнення для більшої частини вашої програми, він точно належить магазину. Але якщо ви просто перемикаєте колір кнопки, натискаючи кнопку, ви можете залишити стан кольору локально визначеним. Дія натискання кнопки може мати інші ефекти, що вимагають відправки дії, але це окремо від простого питання, якого кольору вона повинна бути.

Загалом, намагайтеся, щоб стан вашої програми був якомога меншим. Вам не потрібно засовувати все туди. Робіть це, коли потрібно, або є сенс тримати щось там. Або якщо це полегшує вам життя під час використання Dev Tools. Але не варто занадто перевантажувати його важливість.


Ей, я знаю, що ніколи не буде остаточної відповіді на це питання, але я думаю, що ваша логіка тут дуже обґрунтована
l2silver

3
Чесно кажучи, я насправді не розумію, в чому сенс взагалі використовувати цю річ флюс / редукс. У чому була проблема моделі, керованої подіями?
jayarjo

IMO, це не ідеальна відповідь. Це залежить. Зберігання стану інтерфейсу користувача в стані реакції зробить магазин redux чистим, але в кінцевому підсумку він стане нефункціональним компонентом, який важко перевірити. Хоча збереження стану інтерфейсу користувача у стан реакції додасть багато зусиль для dev, тому що ми повинні написати додаткові редуктори. Однак існує безліч пакетів, які можуть допомогти вам набагато простіше зберігати стан свого інтерфейсу в магазині redux. Перевірте redux.js.org/docs/faq/OrganizingState.html для отримання додаткової інформації.
Рон

19

Поширені запитання щодо Redux: Держава-організатор, що
ця частина офіційного документа redux добре відповіла на ваше запитання.

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

Деякі загальні емпіричні правила визначення того, який тип даних слід розміщувати в Redux:

  • Інші частини програми дбають про ці дані?
  • Чи потрібно мати можливість створювати подальші похідні дані на основі цих вихідних даних?
  • Чи використовуються однакові дані для керування кількома компонентами?
  • Чи є для вас цінністю можливість відновити цей стан до заданого моменту часу (тобто налагодження подорожей у часі)?
  • Ви хочете кешувати дані (тобто використовувати те, що знаходиться в стані, якщо воно вже є, замість того, щоб повторно запитувати його)?

6

Для того, щоб виділити чудове посилання, яке надає @ AR7, і тому, що воно посилалося на деякий час назад:

Використовуйте React для ефемерного стану, який не має значення для програми в усьому світі і не мутує складним чином. Наприклад, перемикання в якомусь елементі інтерфейсу, стан введення форми. Використовуйте Redux для стану, який має значення у всьому світі або мутується складними способами. Наприклад, кешовані користувачі або чернетка публікації.

Іноді вам захочеться перейти зі стану Redux у стан React (коли зберігати щось у Redux стає незручно) або навпаки (коли більше компонентів повинні мати доступ до якогось стану, який раніше був локальним).

Емпіричне правило: робити все, що є менш незручним.

Ден Абрамов: https://github.com/reactjs/redux/issues/1287#issuecomment-175351978


-8

Так, варто прагнути зберігати всі стани компонентів у Redux . Якщо ви це зробите, ви отримаєте користь від багатьох функцій Redux, таких як налагодження подорожей у часі та звіти про помилки, які можна повторно відтворити. Якщо ви цього не зробите, ці функції можуть бути абсолютно непридатними .

Кожного разу, коли ви не зберігаєте зміну стану компонента в Redux, ця зміна повністю втрачається із стеку змін Redux, і користувальницький інтерфейс вашої програми буде не синхронізований із сховищем. Якщо для вас це не важливо, то запитайте себе, навіщо взагалі використовувати Redux? Без нього ваша заявка буде менш складною!

З міркувань продуктивності, можливо, ви захочете повернутися до this.setState()будь-чого, що могло б багато разів надсилати багато дій. Наприклад: збереження стану поля введення в Redux кожного разу, коли користувач вводить ключ, може призвести до низької продуктивності. Ви можете вирішити це, розглядаючи це як транзакцію: після того, як дія користувача "здійснена", збережіть остаточний стан у Redux.

У вашому оригінальному дописі згадується, як спосіб Redux - це "дуже багато коду для написання". Так, але ви можете використовувати абстракції для загальних зразків, таких як стан локальних компонентів.


Покращена налагодження є корисною метою та приємною особливістю скорочення, але я думаю, що відношення сигнал / шум також є важливим. Можна реєструвати кожну змінну в кодовій базі, але це додало б багато додаткового коду, що ускладнило б читання фактичного коду, а журналювання було б важко знайти. Я думаю, те саме стосується використання редуксу. Наявність усіх станів у redux може покращити налагодження, але додаткові коди та абстракції вимагають додаткових витрат, що може ускладнити читання коду і навіть ускладнити деякі завдання налагодження. (І коли аварійні інструменти redux dev збиваються, багато здобутків налагодження втрачається.)
Дж. Д. Сандіфер,

1
Тоді навіщо взагалі використовувати Redux? Якщо ви не вкладете все в Redux, ви втратите всі функції, такі як devtools. Це насправді все або нічого. Якщо ви використовуєте setState () для випадаючого меню, як у верхній відповіді на цю публікацію, ви не можете використовувати devtools для налагодження будь-яких проблем, з якими можуть зіткнутися ваші користувачі в спадному меню. Гірше, коли ти використовуєш setState () для накладання, оскільки немає можливості переміщення у часі до і після показу накладеного зображення. Посипання setState () тут і там дуже схильне до помилок, тому що розробник повинен постійно думати про те, що може зламатися.
kumar303

Як більш конкретна відповідь, реєстрація кожної змінної в кодовій базі не є корисною метафорою, оскільки питання полягає в тому, використовувати this.setState()чи dispatch(action...). Не потрібно використовувати this.setState()скрізь, але коли вам потрібно, я пропоную використовувати Redux замість цього в 99% випадків, повертаючись до this.setState()1% на основі проблем з продуктивністю.
kumar303

Реєстрація кожної змінної мені здається аналогічною до розміщення всього в Redux і однаково недоцільною як загальне правило. Залишення деяких речей поза Redux не заперечує особливостей усього, що є в Redux, поки держава відокремлена. Тобто я все ще можу налагоджувати свою логіку виклику API, яка проходить через Redux, навіть якщо стан вікна вибору не є. У OP є своя суть - для використання Redux потрібно більше коду в багатьох місцях, і, можливо, це не виправдано в конкретному прикладі, який вони перелічили.
Дж. Д. Сандіфер,

Насправді, можливо, ви не зможете налагодити свою логіку API. Це моя думка. Насправді важко передбачити сценарії, коли ви зламаєте подорож у часі, тому краще просто розмістити всі стани (включаючи стан вікна вибору) у Redux, доки не виникне проблема з продуктивністю.
kumar303
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.