|
/* |
|
Whole Shebang |
|
|
|
This example shows most of the commonly used React functionality including: |
|
|
|
- Component lifecycle events |
|
- Mixins |
|
- Default props |
|
- Prop validation |
|
- Looping |
|
- DOM refs |
|
- Browser events |
|
|
|
See more here lifecycle events here: |
|
http://facebook.github.io/react/docs/component-specs.html |
|
|
|
This is by no means how you should write React components, it is just meant to illustrate various features of React. |
|
*/ |
|
|
|
/* |
|
Mixins are just objects with properties that are merged with the compoent |
|
they are included in. |
|
|
|
See: http://facebook.github.io/react/docs/reusable-components.html#mixins |
|
*/ |
|
var MyMixin = { |
|
queryAPIorSomething: function (url, options, successCallback) { |
|
// Do some API magic here... |
|
}, |
|
|
|
// This does not overwrite the components |
|
// `componentWillUnmount` method but will |
|
// be called along side it. |
|
componetWillUnmount: function () { |
|
// Abor XHR request or something else... |
|
} |
|
}; |
|
|
|
|
|
var WholeShebang = React.createClass({ |
|
mixins: [MyMixin], |
|
|
|
propTypes: { |
|
// This will log a message on the console if |
|
// items is not defined or if the wrong type |
|
// is supplied. |
|
items: React.PropTypes.array.isRequired, |
|
|
|
// This will only log if the type is wrong. |
|
prefix: React.PropTypes.string, |
|
}, |
|
|
|
// Sane defaults for your component... |
|
getDefaultProps: function () { |
|
return { |
|
prefix: 'Hello' |
|
} |
|
}, |
|
|
|
getInitialState: function () { |
|
return { |
|
showDefault: false, |
|
} |
|
}, |
|
|
|
componentWillMount: function () { |
|
// Here you could setState, fetch data from a server or something else... |
|
this.queryAPIorSomething('path/to/api.json', {} , function (data) { |
|
this.setState({ data: data }); |
|
}.bind(this)); |
|
}, |
|
|
|
componentDidMount: function () { |
|
// You now have access to the DOM: |
|
console.log(ReactDOM.findDOMNode(this).innerHTML); |
|
|
|
// ... or to component references: |
|
console.log(this.refs.foobar.innerHTML); |
|
}, |
|
|
|
componentWillUpdate: function () { |
|
console.log('component about to update!'); |
|
}, |
|
|
|
componentDidUpdate: function () { |
|
console.log('component updated!'); |
|
// DOM is available here... |
|
}, |
|
|
|
componentWillUnmount: function () { |
|
// Use this to tear down any event listeners |
|
// or do other cleanup before the compoennt is |
|
// destroyed. |
|
console.log('component will unmount!'); |
|
}, |
|
|
|
shouldComponentUpdate: function () { |
|
// This is called when state/props changed and is |
|
// an opportunity where you can return false if |
|
// you don't want the component to update for |
|
// some reason. |
|
return true; |
|
}, |
|
|
|
toggle: function (e) { |
|
// Prevent following the link. |
|
e.preventDefault(); |
|
|
|
// Invert the chosen default. |
|
// This will trigger an intelligent re-render of the component. |
|
this.setState({ showDefault: !this.state.showDefault }) |
|
}, |
|
|
|
render: function () { |
|
var items = this.props.items.map(function (item, index) { |
|
// Any time you construct a list of elements or components, |
|
// you need to set the `key` so React can more easily work |
|
// with the DOM. |
|
return <li key={index}>{item}</li>; |
|
}); |
|
|
|
return ( |
|
<div> |
|
<span ref="foobar"> |
|
Show default: {this.state.showDefault ? 'True' : 'False'} |
|
</span> |
|
<ul> |
|
{items} |
|
</ul> |
|
<a href="" onClick={this.toggle}>Toggle</a> |
|
</div> |
|
); |
|
} |
|
}); |
|
|
|
ReactDOM.render( |
|
<WholeShebang items={['Bob', 'Mary', 'Sally']} />, |
|
document.querySelector('.some-tag') // use other selectors, jQuery or something else to find your target on the page if you want |
|
); |
5-combining-components.js
line 38~
return ( <table> {products} </table> );
should be
return ( <table> <tbody> {products} </tbody> </table> );