|
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