React Basic
[React_Basic 2] TODO 리스트 만들기1 소스코드_클래스형 컴포넌트에서 함수형 컴포넌트로 바꿔보기
thdev
2024. 1. 25. 10:24
[ 클래스형 컴포넌트 ]
- App.js
import React, { Component } from "react";
import "./App.css";
export default class App extends Component {
state = {
todoData: [],
value: "",
};
btnStyle = {
color: "#fff",
border: "none",
padding: "5px 9px",
borderRadius: "50%",
cursor: "pointer",
float: "right",
};
getStyle = (completed) => {
return {
padding: "10px",
borderBottom: "1px #ccc dotted",
textDecoration: completed ? "line-through" : "none",
};
};
handleClick = (id) => {
let newTodoData = this.state.todoData.filter((data) => data.id !== id); //클릭하지 않은 key값 데이터만 뜨게 됨.
console.log("newTodoData", newTodoData);
this.setState({ todoData: newTodoData });
};
handleChange = (e) => {
console.log("e", e.target.value);
this.setState({ value: e.target.value });
};
handleSubmit = (e) => {
//form 안에 input을 전송할때 페이지 리로드 되는 걸 막아줌
e.preventDefault();
//새로운 할일 데이터
let newTodo = {
id: Date.now(),
title: this.state.value,
completed: false,
};
//원래 있던 할 일에 새로운 할일 더해주기
this.setState({ todoData: [...this.state.todoData, newTodo], value: "" });
};
handleCompleteChange = (id) => {
let newTodoData = this.state.todoData.map((data) => {
if (data.id === id) {
data.completed = !data.completed;
}
return data;
});
this.setState({ todoData: newTodoData });
};
render() {
return (
<div className="container">
<div className="todoBlock">
<div className="title">
<h1>Today Plan</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.handleSubmit}>
<input
tpye="text"
name="value"
style={{ flex: "10", padding: "5px" }}
placeholder="오늘의 계획을 입력하세요.."
value={this.state.value}
onChange={this.handleChange}
/>
<input
type="submit"
value="입력"
calssName="btn"
style={{ flex: "1" }}
/>
</form>
</div>
</div>
);
}
}
[함수형 컴포넌트]
- App.js
import React from "react";
import "./App.css";
import { useState } from "react";
export default function App() {
const [todoData, setTodoData] = useState([]);
const [value, setValue] = useState("");
const btnStyle = {
color: "#fff",
border: "none",
padding: "5px 9px",
borderRadius: "50%",
cursor: "pointer",
float: "right",
};
const getStyle = (completed) => {
return {
padding: "10px",
borderBottom: "1px #ccc dotted",
textDecoration: completed ? "line-through" : "none",
};
};
const handleClick = (id) => {
let newTodoData = todoData.filter((data) => data.id !== id); //클릭하지 않은 key값 데이터만 뜨게 됨.
console.log("newTodoData", newTodoData);
setTodoData(newTodoData);
};
const handleChange = (e) => {
setValue(e.target.value);
};
const handleSubmit = (e) => {
//form 안에 input을 전송할때 페이지 리로드 되는 걸 막아줌
e.preventDefault();
//새로운 할일 데이터
let newTodo = {
id: Date.now(),
title: value,
completed: false,
};
//원래 있던 할 일에 새로운 할일 더해주기
setTodoData((prev) => [...prev, newTodo]);
setValue("");
};
const handleCompleteChange = (id) => {
let newTodoData = todoData.map((data) => {
if (data.id === id) {
data.completed = !data.completed;
}
return data;
});
setTodoData(newTodoData);
};
return (
<div className="container">
<div className="todoBlock">
<div className="title">
<h1>Today Plan</h1>
</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={handleSubmit}>
<input
tpye="text"
name="value"
style={{ flex: "10", padding: "5px" }}
placeholder="오늘의 계획을 입력하세요."
value={value}
onChange={handleChange}
/>
<input
type="submit"
value="입력"
calssName="btn"
style={{ flex: "1" }}
/>
</form>
</div>
</div>
);
}
[결과화면]
