Делал перевод статьи The land of undocumented react.js: The Context, где сослался на статью Dan Abramov про умные и глупые компоненты, но почему-то думал что она есть на habrahabr. Думаю эта небольшая статья ни для кого лишней не будет.
Перевод статьи Smart and Dumb Components
Есть простой шаблон, который я нахожу чрезвычайно полезным, когда пишу приложения на React. Если Вы работали с React какое-то время, то, вероятно Вы уже поняли это. Это хорошо объяснено в этой статье, но я хочу добавить пару пунктов.
Вы найдете, что Ваши компоненты намного проще в реиспользовании и обсуждении, если Вы поделите их на две категории. Я называю их Умные (Smart) и Глупые (Dumb), но я так же слышал Fat и Skinny, Stateful и Pure, Screens и Components и так далее. Все это не абсолютно тоже самое но идея похожа.
Мои глупые компоненты:
Мои умные компоненты:
Я кладу их в разные папки, чтобы сделать их различие явным.
Помните, компоненты не должны выдавать DOM. Они должны только обеспечить границы между UI.
Перевод статьи Smart and Dumb Components
Есть простой шаблон, который я нахожу чрезвычайно полезным, когда пишу приложения на React. Если Вы работали с React какое-то время, то, вероятно Вы уже поняли это. Это хорошо объяснено в этой статье, но я хочу добавить пару пунктов.
Вы найдете, что Ваши компоненты намного проще в реиспользовании и обсуждении, если Вы поделите их на две категории. Я называю их Умные (Smart) и Глупые (Dumb), но я так же слышал Fat и Skinny, Stateful и Pure, Screens и Components и так далее. Все это не абсолютно тоже самое но идея похожа.
Мои глупые компоненты:
- не зависят от остальной части приложения, например Flux actions или stores
- часто содержатся в this.props.children
- получают данные и колбэки исключительно через props
- имеют свой css файл
- изредка имеют свой state
- могут использовать другие глупые компоненты
- примеры: Page, Sidebar, Story, UserInfo, List
Мои умные компоненты:
- оборачивает один или несколько глупых или умных компонентов
- хранит состояние стора и пробрасывает его как объекты в глупые компоненты
- вызывает Flux actions и обеспечивает ими глупые компоненты в виде колбэков
- никогда не имеют собственных стилей
- редко сами выдают DOM, используйте глупые компоненты для макета
- примеры: UserPage, FollowersSidebar, StoryContainer, FollowedUserList
Я кладу их в разные папки, чтобы сделать их различие явным.
Профит от такого подхода
- Лучшее разделение ответственности. Вы понимаете Ваше приложение и Ваш UI лучше, если пишете компоненты таким способом.
- Лучшая реюзабельность. Вы можете использовать один и тот же глупый компонент с абсолютно разными источниками состояния.
- Глупые компоненты — это фактически «палитра» Вашего приложения, Вы можете поместить их все на одну страницу и дать дизайнеру их настроить, на залезая в логику приложения. Вы можете запустить регрессивное тестирование на такой странице.
- Это заставляет Вас извлекать «компоненты макеты», такие как Sidebar, Page, ContextMenu и использовать this.props.children вместо дублирования одной и той же верстки в различных умных компонентах.
Помните, компоненты не должны выдавать DOM. Они должны только обеспечить границы между UI.
Elfet
Умные компоненты это новый ViewModel?
webMarshal
Вы имеете ввиду ViewController?
Elfet
ViewModel. Вообще особой разницы нету, то что связывает Model/State с DOM деревом :)
webMarshal
Понял, вы имеете ввиду ViewModel из-за того что умный компонент имеет доступ к данным, да, по-моему норм сравнение, я думал что из-за того что он держит в себе другие умные/глупые компоненты )
wheercool
ViewModel и умный компонент не одно и тоже.
ViewModel вообще не знает про View. View использует ViewModel. (можно иметь очень много View для одного и того же ViewModel)
В React связь обратная — умные компоненты управляют глупыми. Тут более очевидно сравнение с Controller. (вы уже не можете иметь много представлений, для каждого из них вам придется писать свой умный компонент)