<script type="text/babel">
(() => {
const todos = [
{id: 0, title: 'Task 0', isDone: false},
{id: 1, title: 'Task 1', isDone: false},
{id: 2, title: 'Task 2', isDone: true}
];
function TodoItem(props){
return (
<li key={props.todo.id}>
<label>
<input type="checkbox"
checked={props.todo.isDone}
onChange={() => props.checkTodo(props.todo)}
/>
<span className={props.todo.isDone ? 'done' : ''}>
{props.todo.title}
</span>
</label>
</li>
);
}
function TodoList(props){
const todos = props.todos.map(todo => {
return(
<TodoItem
key={todo.id}
todo={todo}
checkTodo={props.checkTodo}
/>
);
});
return (
<ul>
{todos}
</ul>
);
}
class App extends React.Component {
constructor(){
super();
this.state = {
todos: todos
};
this.checkTodo = this.checkTodo.bind(this);
}
checkTodo(todo){
const todos = this.state.todos.map(todo => {
return {id: todo.id, title: todo.title, isDone: todo.isDone};
});
const pos = this.state.todos.map(todo=>{
return todo.id;
}).indexOf(todo.id);
todos[pos].isDone = !todos[pos].isDone;
this.setState({
todos: todos
});
}
render(){
return (
<div>
<h1>My Todo</h1>
<TodoList
todos={this.state.todos}
checkTodo={this.checkTodo}
/>
</div>
);
}
}
ReactDOM.render(
<App/>,
document.getElementById('root')
);
})();
</script>
<script type="text/babel">
(() => {
const todos = [
{id: 0, title: 'Task 0', isDone: false},
{id: 1, title: 'Task 1', isDone: false},
{id: 2, title: 'Task 2', isDone: true}
];
function TodoItem(props){
return (
<li key={props.todo.id}>
<label>
<input type="checkbox"
checked={props.todo.isDone}
onChange={() => props.checkTodo(props.todo)}
/>
<span className={props.todo.isDone ? 'done' : ''}>
{props.todo.title}
</span>
</label>
<span className="cmd" onClick={() => props.deleteTodo(props.todo)}>[x]</span>
</li>
);
}
function TodoList(props){
const todos = props.todos.map(todo => {
return(
<TodoItem
key={todo.id}
todo={todo}
checkTodo={props.checkTodo}
deleteTodo={props.deleteTodo}
/>
);
});
return (
<ul>
{todos}
</ul>
);
}
class App extends React.Component {
constructor(){
super();
this.state = {
todos: todos
};
this.checkTodo = this.checkTodo.bind(this);
this.deleteTodo = this.deleteTodo.bind(this);
}
checkTodo(todo){
const todos = this.state.todos.map(todo => {
return {id: todo.id, title: todo.title, isDone: todo.isDone};
});
const pos = this.state.todos.map(todo=>{
return todo.id;
}).indexOf(todo.id);
todos[pos].isDone = !todos[pos].isDone;
this.setState({
todos: todos
});
}
render(){
return (
<div className="container">
<h1>My Todo</h1>
<TodoList
todos={this.state.todos}
checkTodo={this.checkTodo}
deleteTodo={this.deleteTodo}
/>
</div>
);
}
}
ReactDOM.render(
<App/>,
document.getElementById('root')
);
})();
</script>
function TodoList(props){
const todos = props.todos.map(todo => {
return(
<TodoItem
key={todo.id}
todo={todo}
checkTodo={props.checkTodo}
deleteTodo={props.deleteTodo}
/>
);
});
return (
<ul>
{props.todos.length ? todos: <li>nothing to do</li>}
</ul>
);
}
class App extends React.Component {
constructor(){
super();
this.state = {
todos: todos
};
this.checkTodo = this.checkTodo.bind(this);
this.deleteTodo = this.deleteTodo.bind(this);
}
deleteTodo(todo){
if (!confirm('are you sure?')) {
return;
}
const todos = this.state.todos.slice();
const pos = this.state.todos.indexOf(todo);
todos.splice(pos, 1);
this.setState({
todos: todos
});
}
function TodoItem(props){
return (
<li key={props.todo.id}>
<label>
<input type="checkbox"
checked={props.todo.isDone}
onChange={() => props.checkTodo(props.todo)}
/>
<span className={props.todo.isDone ? 'done' : ''}>
{props.todo.title}
</span>
</label>
<span className="cmd" onClick={() => props.deleteTodo(props.todo)}>[x]</span>
</li>
);
}
function TodoList(props){
const todos = props.todos.map(todo => {
return(
<TodoItem
key={todo.id}
todo={todo}
checkTodo={props.checkTodo}
deleteTodo={props.deleteTodo}
/>
);
});
return (
<ul>
{props.todos.length ? todos: <li>nothing to do</li>}
</ul>
);
}
function TodoForm(props){
return (
<form>
<input type="text" value={props.item} onChange={props.updateItem}/>
<input type="submit" value="Add"/>
</form>
);
}
class App extends React.Component {
constructor(){
super();
this.state = {
todos: todos,
item: ''
};
this.checkTodo = this.checkTodo.bind(this);
this.deleteTodo = this.deleteTodo.bind(this);
this.updateItem = this.updateItem.bind(this);
}
deleteTodo(todo){
if (!confirm('are you sure?')) {
return;
}
const todos = this.state.todos.slice();
const pos = this.state.todos.indexOf(todo);
todos.splice(pos, 1);
this.setState({
todos: todos
});
}
checkTodo(todo){
const todos = this.state.todos.map(todo => {
return {id: todo.id, title: todo.title, isDone: todo.isDone};
});
const pos = this.state.todos.map(todo=>{
return todo.id;
}).indexOf(todo.id);
todos[pos].isDone = !todos[pos].isDone;
this.setState({
todos: todos
});
}
updateItem(e){
this.setState({
item: e.target.value
})
}
render(){
return (
<div className="container">
<h1>My Todo</h1>
<TodoList
todos={this.state.todos}
checkTodo={this.checkTodo}
deleteTodo={this.deleteTodo}
/>
<TodoForm
item={this.state.item}
updateItem={this.updateItem}
/>
</div>
);
}
}
<script type="text/babel">
(() => {
const todos = [];
function TodoItem(props){
return (
<li key={props.todo.id}>
<label>
<input type="checkbox"
checked={props.todo.isDone}
onChange={() => props.checkTodo(props.todo)}
/>
<span className={props.todo.isDone ? 'done' : ''}>
{props.todo.title}
</span>
</label>
<span className="cmd" onClick={() => props.deleteTodo(props.todo)}>[x]</span>
</li>
);
}
function TodoList(props){
const todos = props.todos.map(todo => {
return(
<TodoItem
key={todo.id}
todo={todo}
checkTodo={props.checkTodo}
deleteTodo={props.deleteTodo}
/>
);
});
return (
<ul>
{props.todos.length ? todos: <li>nothing to do</li>}
</ul>
);
}
function TodoForm(props){
return (
<form onSubmit={props.addTodo}>
<input type="text" value={props.item} onChange={props.updateItem}/>
<input type="submit" value="Add"/>
</form>
);
}
function getUniqueId(){
return new Date().getTime().toString(36) + '-' + Math.random().toString(36);
}
class App extends React.Component {
constructor(){
super();
this.state = {
todos: todos,
item: ''
};
this.checkTodo = this.checkTodo.bind(this);
this.deleteTodo = this.deleteTodo.bind(this);
this.updateItem = this.updateItem.bind(this);
this.addTodo = this.addTodo.bind(this);
}
addTodo(e){
e.preventDefault();
if(this.state.item.trim()===''){
return;
}
const item = {
id: getUniqueId(),
title: this.state.item,
isDone: false
};
const todos = this.state.todos.slice();
todos.push(item);
this.setState({
todos: todos,
item: ''
});
}
deleteTodo(todo){
if (!confirm('are you sure?')) {
return;
}
const todos = this.state.todos.slice();
const pos = this.state.todos.indexOf(todo);
todos.splice(pos, 1);
this.setState({
todos: todos
});
}
checkTodo(todo){
const todos = this.state.todos.map(todo => {
return {id: todo.id, title: todo.title, isDone: todo.isDone};
});
const pos = this.state.todos.map(todo=>{
return todo.id;
}).indexOf(todo.id);
todos[pos].isDone = !todos[pos].isDone;
this.setState({
todos: todos
});
}
updateItem(e){
this.setState({
item: e.target.value
})
}
render(){
return (
<div className="container">
<h1>My Todo</h1>
<TodoList
todos={this.state.todos}
checkTodo={this.checkTodo}
deleteTodo={this.deleteTodo}
/>
<TodoForm
item={this.state.item}
updateItem={this.updateItem}
addTodo={this.addTodo}
/>
</div>
);
}
}
ReactDOM.render(
<App/>,
document.getElementById('root')
);
})();
</script>
各パーツをそれぞれコンポートネントとして切り分ける。