#17 react-todo-app : class component -> hooks
This commit is contained in:
@@ -1,13 +1,11 @@
|
|||||||
import React, { Component } from "react";
|
import React, { useState } from "react";
|
||||||
import "./App.css";
|
import "./App.css";
|
||||||
|
|
||||||
export default class App extends Component {
|
export default function App() {
|
||||||
state = {
|
const [todoData, setTodoData] = useState([]);
|
||||||
todoData: [],
|
const [value, setValue] = useState("");
|
||||||
value: "",
|
|
||||||
};
|
|
||||||
|
|
||||||
btnStyle = {
|
const btnStyle = {
|
||||||
color: "#fff",
|
color: "#fff",
|
||||||
border: "none",
|
border: "none",
|
||||||
padding: "5px 9px",
|
padding: "5px 9px",
|
||||||
@@ -16,7 +14,7 @@ export default class App extends Component {
|
|||||||
float: "right",
|
float: "right",
|
||||||
};
|
};
|
||||||
|
|
||||||
getStyle = (completed) => {
|
const getStyle = (completed) => {
|
||||||
return {
|
return {
|
||||||
padding: "10px",
|
padding: "10px",
|
||||||
borderBottom: "1px #ccc dotted",
|
borderBottom: "1px #ccc dotted",
|
||||||
@@ -24,81 +22,77 @@ export default class App extends Component {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
handleClick = (id) => {
|
const handleClick = (id) => {
|
||||||
let newTodoData = this.state.todoData.filter((data) => data.id !== id);
|
let newTodoData = todoData.filter((data) => data.id !== id);
|
||||||
this.setState({ todoData: newTodoData });
|
setTodoData(newTodoData);
|
||||||
};
|
};
|
||||||
|
|
||||||
handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
this.setState({ value: e.target.value });
|
setValue(e.target.value);
|
||||||
};
|
};
|
||||||
|
|
||||||
handlkeSubmit = (e) => {
|
const handlkeSubmit = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
let newTodo = {
|
let newTodo = {
|
||||||
id: Date.now(),
|
id: Date.now(),
|
||||||
title: this.state.value,
|
title: value,
|
||||||
completed: false,
|
completed: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setState({ todoData: [...this.state.todoData, newTodo], value: "" });
|
setTodoData((prev) => [...prev, newTodo]);
|
||||||
|
setValue("");
|
||||||
};
|
};
|
||||||
|
|
||||||
handleCompleteChange = (id) => {
|
const handleCompleteChange = (id) => {
|
||||||
let newTodoData = this.state.todoData.map((data) => {
|
let newTodoData = todoData.map((data) => {
|
||||||
if (data.id === id) {
|
if (data.id === id) {
|
||||||
data.completed = !data.completed;
|
data.completed = !data.completed;
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.setState({ todoData: newTodoData });
|
setTodoData(newTodoData);
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
return (
|
||||||
return (
|
<div className="container">
|
||||||
<div className="container">
|
<div className="todoBlock">
|
||||||
<div className="todoBlock">
|
<div className="title">
|
||||||
<div className="title">
|
<h1>할 일 목록</h1>
|
||||||
<h1>할 일 목록</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{this.state.todoData.map((data) => (
|
|
||||||
<div style={this.getStyle(data.completed)} key={data.id}>
|
|
||||||
<input
|
|
||||||
type={"checkbox"}
|
|
||||||
defaultChecked={false}
|
|
||||||
onChange={() => this.handleCompleteChange(data.id)}
|
|
||||||
/>
|
|
||||||
{data.title}
|
|
||||||
<button
|
|
||||||
style={this.btnStyle}
|
|
||||||
onClick={() => this.handleClick(data.id)}
|
|
||||||
>
|
|
||||||
x
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
|
|
||||||
<form style={{ display: "flex" }} onSubmit={this.handlkeSubmit}>
|
|
||||||
<input
|
|
||||||
type={"text"}
|
|
||||||
name={"value"}
|
|
||||||
style={{ flex: "10", padding: "5px" }}
|
|
||||||
placeholder={"해야 할 일을 입력하세요."}
|
|
||||||
value={this.state.value}
|
|
||||||
onChange={this.handleChange}
|
|
||||||
/>
|
|
||||||
<input
|
|
||||||
type={"submit"}
|
|
||||||
value={"입력"}
|
|
||||||
className={"btn"}
|
|
||||||
style={{ flex: "1" }}
|
|
||||||
/>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{todoData.map((data) => (
|
||||||
|
<div style={getStyle(data.completed)} key={data.id}>
|
||||||
|
<input
|
||||||
|
type={"checkbox"}
|
||||||
|
defaultChecked={false}
|
||||||
|
onChange={() => handleCompleteChange(data.id)}
|
||||||
|
/>
|
||||||
|
{data.title}
|
||||||
|
<button style={btnStyle} onClick={() => handleClick(data.id)}>
|
||||||
|
x
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
|
||||||
|
<form style={{ display: "flex" }} onSubmit={handlkeSubmit}>
|
||||||
|
<input
|
||||||
|
type={"text"}
|
||||||
|
name={"value"}
|
||||||
|
style={{ flex: "10", padding: "5px" }}
|
||||||
|
placeholder={"해야 할 일을 입력하세요."}
|
||||||
|
value={value}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
<input
|
||||||
|
type={"submit"}
|
||||||
|
value={"입력"}
|
||||||
|
className={"btn"}
|
||||||
|
style={{ flex: "1" }}
|
||||||
|
/>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
);
|
</div>
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user