…unless you need state • Some components are affected by user interactions • Since props are immutable, interactions that change the component must either be handled by the parent component, or translated to state
The best of both worlds • An interactive component maintains its own state • Sometimes it yields control to its parent (props) • It can be both Controlled and Uncontrolled
Example: TabBar • When you click on a tab, it becomes selected • The other tabs in the bar become deselected • The selected tab is stored as state in the component
Example: TabBar • This works fine until one day… • A new component is introduced to the site that also controls which tab is selected • Instead of pulling state management out of TabBar, make it a controllable
–Sebastian Markbåge, who knows what idiomatic React is “…mixins (are) an escape hatch to work around reusability limitations… Idiomatic React reusable code should primarily be implemented in terms of composition and not inheritance.”
–Dan Abramov, while explaining what Sebastian Markbåge meant “Mixins are dead. Long live composition.” –Sebastian Markbåge, again “Another alternative to mixins… Higher Order Components.”
Always use props! • No state in TabBar* • the controllable HOC handles the magic * Technically, the newly decorated TabBar does have state. The controllable can be thought of as providing an optional binding to a per-component state store.
– Sebastian McKenzie in the Babel.js 5.0 release post “Yehuda Katz' stage 1 decorators proposal allows you to elegantly compose property descriptors and metadata decoration.”
JavaScript Decorators! • An expression that evaluates to a function • Easily annotate and modify classes and properties • Can act like a factory, taking additional arguments at design time • Currently a Stage 1 TC39 (ECMAScript) Proposal • Supported in Babel.js 5.0! (Python style. Basically lifted straight from Python.)
react-controllables https://github.com/matthewwithanm/react-controllables Another alternative to mixins…Higher Order https://twitter.com/sebmarkbage/status/565657028665016321 JavaScript Decorators Proposal https://github.com/wycats/javascript-decorators Mixins Are Dead. Long Live Composition https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order- Babel.js 5.0 Release Announcement http://babeljs.io/blog/2015/03/31/5.0.0/ Props vs State https://speakerdeck.com/lettertwo/props-vs-state