diff --git a/react.md b/react.md
index 5ef9e43ad..4b7642df1 100644
--- a/react.md
+++ b/react.md
@@ -3,27 +3,21 @@ title: React.js
layout: default
---
-### Basic class
+## Components
```js
-React.createClass({
+var Component = React.createClass({
render: function () {
- return (
-
Hello {this.props.name}
- );
+ return Hello {this.props.name}
;
}
});
```
-### Using components
-
```js
-var Component = React.createClass({ ... });
-
-var compo = React.render(, mountnode);
+var c = React.render(, document.body);
```
-### States
+## States & Properties
```js
this.setState({ editing: true });
@@ -32,8 +26,6 @@ this.state.editing === true
this.replaceState({ ... });
```
-### Properties
-
```js
this.setProps({ fullscreen: true });
this.props.fullscreen === true
@@ -41,181 +33,235 @@ this.props.fullscreen === true
this.replaceProps({ ... });
```
-### [API](http://facebook.github.io/react/docs/component-api.html)
+### Initial states and properties
```js
-c.getDOMNode() // deprecated 0.13
-React.findDOMNode(c) // 0.13+
+React.createClass({
+ // Pre-populates `this.state.data`
+ getInitialState: function () {
+ return {data: []};
+ },
-c.forceUpdate()
-c.isMounted()
+ // Pre-populates `this.props.name`
+ getDefaultProps: function () {
+ return {name: ''};
+ }
+);
```
-### [Methods](http://facebook.github.io/react/docs/component-specs.html)
+## Component API
+
+These are methods available for `Component` instances. See [Component API](http://facebook.github.io/react/docs/component-api.html).
+{:.center}
```js
-{
- render: function()
- getInitialState: function()
- getDefaultProps: function()
- mixins: []
- propTypes: {} /* for validation */
- statics: { .. } /* static methods */
- displayName: '..' /* automatically filled in by jsx */
+React.findDOMNode(c) // 0.13+
+```
+
+```js
+c.forceUpdate()
+c.isMounted()
+
+c.state
+c.props
+
+c.setState({ ... })
+c.setProps({ ... })
+c.replaceState({ ... })
+c.replaceProps({ ... })
+
+c.refs
+```
+
+### [Component specs](http://facebook.github.io/react/docs/component-specs.html)
+Methods and properties you can override in your class definitions.
+
+| Method | What |
+| ---- | ---- |
+| [`render()`](http://facebook.github.io/react/docs/component-specs.html#render) | |
+| [`getInitialState()`](http://facebook.github.io/react/docs/component-specs.html#getinitialstate) | |
+| [`getDefaultProps()`](http://facebook.github.io/react/docs/component-specs.html#getdefaultprops) | |
+| [`mixins: [ ... ]`](http://facebook.github.io/react/docs/component-specs.html#mixins) | Mixins |
+| [`propTypes: { ... }`](http://facebook.github.io/react/docs/component-specs.html#proptypes) | Validation ... [more](#property-validation) |
+| [`statics: { ... }`](http://facebook.github.io/react/docs/component-specs.html#statics) | Static methods |
+| [`displayName: "..."`](http://facebook.github.io/react/docs/component-specs.html#displayname) | Automatically filled by JSX |
+{:.greycode.no-head}
+
+## [Lifecycle](http://facebook.github.io/react/docs/component-specs.html)
+
+### Mounting
+
+| `componentWillMount()` | Before rendering (no DOM yet) |
+| `componentDidMount()` | After rendering |
+{:.greycode.no-head.lc}
+
+### Updating
+
+| `componentWillReceiveProps`*(newProps={})* | Use `setState()` here; not on initial |
+| `shouldComponentUpdate`*(newProps={}, newState={})* | Skips `render()` if returns false |
+| `componentWillUpdate`*(newProps={}, newState={})* | Can't use `setState()` here |
+| `componentDidUpdate`*(prevProps={}, prevState={})* | Operate on the DOM here |
+{:.greycode.no-head.lc}
+
+### Cleanup
+
+| `componentWillUnmount()` | Invoked before DOM removal |
+{:.greycode.no-head.lc}
+
+
+
+### Example: before rendering
+
+```js
+React.createClass({
+ componentWillMount: function () {
+ $.get(this.props.url, function (data) {
+ this.setState(data);
+ });
+ },
+
+ render: function () {
+ return (
+
+ );
+ }
+});
+```
+
+## DOM nodes
+
+### References
+Allows access to DOM nodes. See [References](http://facebook.github.io/react/docs/more-about-refs.html).
+
+```html
+
+```
+{:.light}
+
+```js
+this.refs.myInput
+React.findDOMNode(this.refs.myInput).focus()
+React.findDOMNode(this.refs.myInput).value
+```
+
+### DOM Events
+Add attributes like `onChange`. See [events](https://facebook.github.io/react/docs/events.html).
+
+```html
+
+```
+{:.light}
+
+```js
+handleChange: function(event) {
+ this.setState({ value: event.target.value });
}
```
-### [Lifecycle](http://facebook.github.io/react/docs/component-specs.html)
+### Two-way binding
+Use [LinkedStateMixin](http://facebook.github.io/react/docs/two-way-binding-helpers.html) for easier two-way binding.
-```js
-componentWillMount()
-componentDidMount()
-
-// not on initial render
-componentWillReceiveProps(props)
-shouldComponentUpdate(props, state)
-componentWillUpdate(props, state)
-componentDidUpdate(prevProps, prevState)
-
-componentWillUnmount()
-
-// ...there is no DidUnmount or ReceiveState.
+```html
+Email:
```
-
-### Initial states
-
- React.createClass({
- getInitialState: function () {
- return {data: []};
- },
-
- render: function () {
- return (
-
- );
- }
- });
-
-### Default properties
-
- React.createClass({
- getDefaultProps: function () {
- return {name: ''};
- }
- );
-
-### Before rendering
-
- React.createClass({
- componentWillMount: function () {
- $.get(this.props.url, function (data) {
- this.setState(data);
- });
- },
-
- render: function () {
- return (
-
- );
- }
- });
-
-### Actions
-
-
-
- React.createClass({
- handleSubmit: function (event) {
- name = this.refs['name'].getDOMNode().value;
- // see two-way binding below
- }
- })
-
-### [Two-way binding](http://facebook.github.io/react/docs/two-way-binding-helpers.html)
+{:.light}
```js
React.createClass({
- mixins: [React.addons.LinkedStateMixin],
- getInitialState: function() {
- return {value: 'Hello!'};
- },
- render: function() {
- return ;
- }
+ mixins: [React.addons.LinkedStateMixin]
});
-// LinkedStateMixin adds a method to your React component called
-// linkState().
```
-### Lists
+```js
+this.state.email
+```
- var TodoList = React.createClass({
- render: function() {
- var createItem = function(itemText) {
- return {itemText};
- };
- return {this.props.items.map(createItem)}
;
- }
- });
+## Property validation
-### [Property validation](http://facebook.github.io/react/docs/reusable-components.html#prop-validation)
+### Basic types
+Primitive types: `.string`, `.number`, `.func`, and `.bool`. See [propTypes](http://facebook.github.io/react/docs/reusable-components.html#prop-validation).
```js
React.createClass({
propTypes: {
- // required
- requiredFunc: React.PropTypes.func.isRequired,
- requiredAny: React.PropTypes.any.isRequired,
-
- // primitives, optional by default
- bool: React.PropTypes.bool,
- func: React.PropTypes.func,
- number: React.PropTypes.number,
- string: React.PropTypes.string,
+ email: React.PropTypes.string,
+ seats: React.PropTypes.number,
+ callback: React.PropTypes.func,
+ isClosed: React.PropTypes.bool,
+ any: React.PropTYpes.any,
}
});
```
-Also:
+### Required types
+Add `.isRequired`.
```js
- propTypes: {
- message: React.PropTypes.instanceOf(Message), // instanceof any Class
- element: React.PropTypes.element, // A React element
- enum: React.PropTypes.oneOf(['News', 'Photos']),
- node: React.PropTypes.node, // num, string, element, or array of these
+propTypes: {
+ requiredFunc: React.PropTypes.func.isRequired,
+ requiredAny: React.PropTypes.any.isRequired,
+```
- // any of below
- union: React.PropTypes.oneOfType([
- React.PropTypes.string,
- React.PropTypes.number
- ]),
+### React elements
+Use `.element`, `.node`.
- // arrays
- array: React.PropTypes.array,
- arrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
+```js
+propTypes: {
+ element: React.PropTypes.element, // react element
+ node: React.PropTypes.node, // num, string, element
+ // ...or array of those
+```
- // objects
- object: React.PropTypes.object,
- objectOf: React.PropTypes.objectOf(React.PropTypes.number),
+### Enumerables
+Use `.oneOf`, `.oneOfType`.
- // An object taking on a particular shape
- object2: React.PropTypes.shape({
- color: React.PropTypes.string,
- fontSize: React.PropTypes.number
- }),
+```
+propTypes: {
+ enum: React.PropTypes.oneOf(['M','F']), // enum
+ union: React.PropTypes.oneOfType([ // any
+ React.PropTypes.string,
+ React.PropTypes.number ]),
+```
- // custom validator
- customProp: function(props, propName, componentName) {
- if (!/matchme/.test(props[propName])) {
- return new Error('Validation failed!');
- }
+### Arrays and objects
+Use `.array[Of]`, `.object[Of]`, `.instanceOf`, `.shape`.
+
+```js
+propTypes: {
+ array: React.PropTypes.array,
+ arrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
+ object: React.PropTypes.object,
+ objectOf: React.PropTypes.objectOf(React.PropTypes.number),
+
+ message: React.PropTypes.instanceOf(Message),
+
+ object2: React.PropTypes.shape({
+ color: React.PropTypes.string,
+ size: React.PropTypes.number
+ }),
+```
+
+### Custom validation
+Supply your own function.
+
+```js
+propTypes: {
+ customProp: function(props, propName, componentName) {
+ if (!/matchme/.test(props[propName])) {
+ return new Error('Validation failed!');
}
}
+}
```
+## Other features
+
### [Class set](http://facebook.github.io/react/docs/class-name-manipulation.html)
render: function() {
@@ -249,8 +295,52 @@ Also:
componentWillMount: function() { .. }
}
-----
+## [Top level API](https://facebook.github.io/react/docs/top-level-api.html)
-### See also
+```js
+React.findDOMNode(c)
+React.createClass({ ... })
+
+React.render(, domnode, [callback])
+React.unmountComponentAtNode(domnode)
+
+React.renderToString()
+React.renderToStaticMarkup()
+
+React.isValidElement(c)
+```
+
+## JSX patterns
+
+### Style shorthand
+See [inline styles](https://facebook.github.io/react/tips/inline-styles.html).
+
+```js
+var style = { backgroundImage: 'url(x.jpg)', height: 10 };
+return ;
+```
+
+### InnerHTML
+See [dangerously set innerHTML](https://facebook.github.io/react/tips/dangerously-set-inner-html.html).
+
+```js
+function createMarkup() { return {__html: 'First · Second'}; };
+
+```
+
+### Lists
+
+```js
+var TodoList = React.createClass({
+ render: function() {
+ function item(itemText) {
+ return {itemText};
+ };
+ return {this.props.items.map(item)}
;
+ }
+});
+```
+
+## See also
* [Animations](http://facebook.github.io/react/docs/animation.html)