mirror of
https://github.com/reactjs/react.dev.git
synced 2026-02-24 04:33:10 +00:00
Now examples are trasnformed to GraphQL during build and assembled by the index template. This makes them easier to edit and tie in with their associated markdown description.
59 lines
1.2 KiB
JavaScript
59 lines
1.2 KiB
JavaScript
class TodoApp extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = { items: [], text: '' };
|
|
this.handleChange = this.handleChange.bind(this);
|
|
this.handleSubmit = this.handleSubmit.bind(this);
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div>
|
|
<h3>TODO</h3>
|
|
<TodoList items={this.state.items} />
|
|
<form onSubmit={this.handleSubmit}>
|
|
<input
|
|
onChange={this.handleChange}
|
|
value={this.state.text}
|
|
/>
|
|
<button>
|
|
Add #{this.state.items.length + 1}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
handleChange(e) {
|
|
this.setState({ text: e.target.value });
|
|
}
|
|
|
|
handleSubmit(e) {
|
|
e.preventDefault();
|
|
if (!this.state.text.length) {
|
|
return;
|
|
}
|
|
const newItem = {
|
|
text: this.state.text,
|
|
id: Date.now()
|
|
};
|
|
this.setState(prevState => ({
|
|
items: prevState.items.concat(newItem),
|
|
text: ''
|
|
}));
|
|
}
|
|
}
|
|
|
|
class TodoList extends React.Component {
|
|
render() {
|
|
return (
|
|
<ul>
|
|
{this.props.items.map(item => (
|
|
<li key={item.id}>{item.text}</li>
|
|
))}
|
|
</ul>
|
|
);
|
|
}
|
|
}
|
|
|
|
ReactDOM.render(<TodoApp />, mountNode); |