Застереження : Коли я відповів на це запитання, я вчився / намагався впровадити ванільний потік, і був трохи скептичний щодо цього. Пізніше я переніс усе на Redux. Отже, порада: просто йдіть з Redux або MobX. Швидше за все, вам навіть більше не знадобиться відповідь на це запитання (за винятком науки).
Передача початкового стану компоненту як a prop
є анти-шаблоном, оскільки getInitialState
метод викликається лише перший раз, коли компонент відображається. Це означає, що якщо ви повторно рендеріруєте цей компонент, передаючи інше значення як a prop
, компонент не реагуватиме відповідно, оскільки компонент буде зберігати стан з першого разу, коли він був відтворений. Це дуже схильне до помилок.
І ось що вам слід зробити:
Постарайтеся зробити свої компоненти якомога бездержавнішими. Безкомпонентні компоненти легше перевірити, оскільки вони виводять результат на основі введення . Просто так.
Але ей .. дані моїх компонентів змінюються .. Я не можу зробити їх без громадянства
Так, для більшості з них ви можете. Для цього виберіть зовнішній компонент, який буде державним органом. На вашому прикладі ви можете створити Dashboard
компонент, що містить дані, і Widget
компонент, який повністю не має стану. Він Dashboard
відповідає за отримання всіх даних, а потім надання кількох, Widgets
які отримують все необхідне props
.
Але мої віджети мають певний стан .. користувач може їх налаштувати. Як зробити їх без громадянства?
Ви Widget
можете виставляти події, які при обробці спричиняють Dashboard
зміну стану, що міститься , що спричиняє Widget
повторне відображення кожного. Ви створюєте "події" у своєму Widget
, отримуючи props
функцію.
Гаразд, отже, інформаційна панель зберігає стан, але як мені передати початковий стан?
У вас є два варіанти. Найбільш рекомендованим є те, що ви робите виклик Ajax у Dashboard
getInitialState
методі, щоб отримати початковий стан із сервера. Ви також можете використовувати Flux , що є більш складним способом управління даними. Потік - це скоріше шаблон, а не реалізація. Ви можете використовувати чистий Flux з реалізацією Facebook на Dispatcher
, але ви можете використовувати сторонні реалізації, такі як Redux , Alt або Fluxxor .
Крім того , ви можете передати це початковий стан , як prop
до Dashboard
, явно заявляючи , що це лише початковий стан .. як initialData
, наприклад. Однак, якщо ви вибрали цей шлях, ви не зможете передати йому інший початковий стан за кордоном, оскільки він "запам'ятає" стан після першого відтворення.
OBS
Ви не зовсім праві у своїх визначеннях.
Стан використовується для зберігання змінних даних, тобто даних, які будуть змінюватися протягом життєвого циклу компонента. Зміни у стані повинні вноситися за допомогою setState
методу, що призведе до повторного відтворення компонента.
Реквізит використовується для передачі незмінних даних до компонентів. Вони не повинні змінюватися протягом життєвого циклу компонента. Компоненти, що використовують лише реквізит, не мають громадянства.
Це відповідне джерело про те, "як передати початковий стан компонентам".