Properties
Props (short for properties) are a Component’s configuration, its options if you may. They are received from above and immutable as far as the Component receiving them is concerned. A Component cannot change its props, but it is responsible for putting together the props of its child Components. react man
State
The state starts with a default value when a Component mounts and then suffers from mutations in time (mostly generated from user events). It’s a serialisable representation of one point in time—a snapshot. A Component manages its own state internally, but—besides setting an initial state—has no business fiddling with the state of its children. You could say the state is private. rect man
app init (webpack + Babel + ESLint):
npm install -g create-react-app # JS: create-react-app proj_name create-react-app proj_name --typescript cd proj_name npm run start
property example:
var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList data={this.props.data} /> <CommentForm /> </div> ); } }); var CommentList = React.createClass({ render: function() { var commentNodes = this.props.data.map(function (comment) { return ( <Comment author={comment.author}> {comment.text} </Comment> ); }); return ( <div className="commentList"> {commentNodes} </div> ); } }); var el_cont = document.getElementById('content'); ReactDOM.render(<CommentBox data={data} />, el_cont ); ReactDOM.render(<CommentList data={data} />, el_cont );
state example:
var Box = React.createClass({ getInitialState: function() { return { hasDetailsVisible: false }; }, handleToggle: function() { this.setState({ hasDetailsVisible: !this.state.hasDetailsVisible }); }, render: function() { var list = this.props.list.map(function(item) { return <li>{item}</li> }); var detailsStyle = this.state.hasDetailsVisible ? {display: 'block'} : {display: 'none'}; return ( <div> <h1>{this.props.title}</h1> <button onClick={this.handleToggle}>toggle details</button> <ul style={detailsStyle} > {list} </ul> </div> ); } }); ReactDOM.render(<Box title="Cool Box" list={['item 1', 'item 2', 'item 3', 'item N']} />, document.body);
events example:
var Box = React.createClass({ getInitialState: function() { return { hasDetailsVisible: false }; }, handleToggle: function(event) { this.setState({ hasDetailsVisible: !this.state.hasDetailsVisible }); }, render: function() { var list = this.props.list.map(function(item) { return <li>{item}</li> }); var detailsStyle = this.state.hasDetailsVisible ? {display: 'block'} : {display: 'none'}; return ( <div> <h1>{this.props.title}</h1> <button onClick={this.handleToggle} >toggle details</button> <ul style={detailsStyle}> {list} </ul> </div> ); } }); ReactDOM.render(<Box title="Cool Box" list={['item 1', 'item 2', 'item 3', 'item N']} />, document.body);
npx create-react-app my-typescript-app --typescript
base template:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>I'm in a React app!</title>
</head>
<body>
<div id="react-app"></div>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react.js"></script>
<script src="https://cdn.jsdelivr.net/react/0.14.0-rc1/react-dom.js"></script>
</body>
</html>
/// <reference path="../typing/react.d.ts" /> /// <reference path="../typings/main.d.ts" /> import * as React from 'react'; import * as ReactDOM from 'react-dom'; interface DemoProps { name:string; age:string; } class Demo extends React.Component<DemoProps, any> { private foo:number; constructor(props:DemoProps) { super(props); this.foo = 42; } render() { return <div>Hello world!</div> } } function render_test() { var mountNode = document.getElementById('content'); ReactDOM.render(<Demo name="John" age="22" />, mountNode); } render_test();
tsc --jsx react --module commonjs ./app/test.tsx
Bower/NPM/TSD
npm install --save react react-dom tsd install react react-dom --save bower install --save react
YO Generators