|
1 | 1 | var TODO_COMPONENT = ` |
2 | | -var TodoList = React.createClass({ |
3 | | - render: function() { |
4 | | - var createItem = function(item) { |
5 | | - return <li key={item.id}>{item.text}</li>; |
6 | | - }; |
7 | | - return <ul>{this.props.items.map(createItem)}</ul>; |
| 2 | +class TodoApp extends React.Component { |
| 3 | + constructor(props) { |
| 4 | + super(props); |
| 5 | + this.handleChange = this.handleChange.bind(this); |
| 6 | + this.handleSubmit = this.handleSubmit.bind(this); |
| 7 | + this.state = {items: [], text: ''}; |
8 | 8 | } |
9 | | -}); |
10 | | -var TodoApp = React.createClass({ |
11 | | - getInitialState: function() { |
12 | | - return {items: [], text: ''}; |
13 | | - }, |
14 | | - onChange: function(e) { |
15 | | - this.setState({text: e.target.value}); |
16 | | - }, |
17 | | - handleSubmit: function(e) { |
18 | | - e.preventDefault(); |
19 | | - var nextItems = this.state.items.concat([{text: this.state.text, id: Date.now()}]); |
20 | | - var nextText = ''; |
21 | | - this.setState({items: nextItems, text: nextText}); |
22 | | - }, |
23 | | - render: function() { |
| 9 | +
|
| 10 | + render() { |
24 | 11 | return ( |
25 | 12 | <div> |
26 | 13 | <h3>TODO</h3> |
27 | 14 | <TodoList items={this.state.items} /> |
28 | 15 | <form onSubmit={this.handleSubmit}> |
29 | | - <input onChange={this.onChange} value={this.state.text} /> |
| 16 | + <input onChange={this.handleChange} value={this.state.text} /> |
30 | 17 | <button>{'Add #' + (this.state.items.length + 1)}</button> |
31 | 18 | </form> |
32 | 19 | </div> |
33 | 20 | ); |
34 | 21 | } |
35 | | -}); |
| 22 | +
|
| 23 | + handleChange(e) { |
| 24 | + this.setState({text: e.target.value}); |
| 25 | + } |
| 26 | +
|
| 27 | + handleSubmit(e) { |
| 28 | + e.preventDefault(); |
| 29 | + var newItem = { |
| 30 | + text: this.state.text, |
| 31 | + id: Date.now() |
| 32 | + }; |
| 33 | + this.setState((prevState) => ({ |
| 34 | + items: prevState.items.concat(newItem), |
| 35 | + text: '' |
| 36 | + })); |
| 37 | + } |
| 38 | +} |
| 39 | +
|
| 40 | +class TodoList extends React.Component { |
| 41 | + render() { |
| 42 | + return ( |
| 43 | + <ul> |
| 44 | + {this.props.items.map(item => ( |
| 45 | + <li key={item.id}>{item.text}</li> |
| 46 | + ))} |
| 47 | + </ul> |
| 48 | + ); |
| 49 | + } |
| 50 | +} |
36 | 51 |
|
37 | 52 | ReactDOM.render(<TodoApp />, mountNode); |
38 | | -`; |
| 53 | +`.trim(); |
39 | 54 |
|
40 | 55 | ReactDOM.render( |
41 | 56 | <ReactPlayground codeText={TODO_COMPONENT} />, |
|
0 commit comments