리액트 Hooks를 이용해서 To-Do 앱을 함수형 컴포넌트로 바꾸기
클래스 컴포넌트에서 함수 컴포넌트로 바꾸는 순서
컴포넌트 자체를 바꾸기
export default class App extends Component {
이 부분을 아래와 같이 바꾸자.
export default function App() {
그리고 더이상 Component를 extends하지 않기 때문에
import React, {Component} from "react";
이 부분을 아래와 같이 바꾼다.
import React from "react";
render() { // 클래스 안에서 render를 작성할 수 있다.
return(
...
이 부분을 아래와 같이 render()을 지워준다.
return(
...
useState를 사용할 것이기 때문에,
import React, {useState} from "react";
이를 import 해온다.
그리고,
state = {
todoData : [],
value: ""
};
이 부분을 지우고,
const [todoData, setTodoData] = useState([]);
const [value, setValue] = useState("");
위의 코드를 넣어준다.
그리고,
let newTodoData = this.state.todoData.filter(data => data.id !== id);
title: this.state.value,
this.setState({ todoData: [...this.state.todoData, newTodo ], value:""});
let newTodoData = this.state.todoData.map(data => {
{this.state.todoData.map((data) => (
value={this.state.value}
위의 코드에서 this.state. 부분을 모두 지워준다.
this.setState({todoData: newTodoData});
위의 코드를 아래와 같이 바꾼다.
setTodoData(newTodoData)
마찬가지로,
this.setState({ value: e.target.value })
이 코드도 아래와 같이 바꾼다.
setValue(e.target.value)
이 코드는 원래 있던 할 일에 새로운 일을 더해주기 위해 '...' spread operator(전개 구문)을 사용해 객체 하나를 추가해줬는데,
this.setState({ todoData: [...todoData, newTodo ], value:""});
Hooks를 사용할 때에는, Setter에서 이전 State를 가지고 오기 위해서는 인수에 함수를 이용해서 사용할 수 있다.
setTodoData(prev => [...prev, newTodo]);
setValue("");
클래스 컴포넌트에서는 다음과 같이 바로 작성하면 됐지만,
handleClick = (id) => {
let newTodoData = todoData.filter(data => data.id !== id);
console.log('newTodoData', newTodoData);
setTodoData(newTodoData)
}
handleChange = (e) => {
setValue(e.target.value)
}
handleSubmit = (e) => {
e.preventDefault(); //페이지가 리로드 되는 것을 막아줌.
getStyle = (completed) => {
return {
padding: "10px",
borderBottom: "1px #ccc dotted",
textDecoration: completed ?"line-through" :"none"
}
}
handleCompleteChange = (id) => {
let newTodoData = todoData.map(data => {
if(data.id === id) {
data.completed = !data.completed; // 반대로
}
return data;
})
setTodoData(newTodoData);
}
btnStyle = {
color: "#fff",
border: "none",
padding: "5px 9px",
borderRadius: "50%",
cursor: "pointer",
float: "right"
}
하지만 함수 컴포넌트에서는 const, class 등을 이용해서 변수나 함수를 정의해야한다.
const handleClick = (id) => {
let newTodoData = todoData.filter(data => data.id !== id);
console.log('newTodoData', newTodoData);
setTodoData(newTodoData)
}
const btnStyle = {
color: "#fff",
border: "none",
padding: "5px 9px",
borderRadius: "50%",
cursor: "pointer",
float: "right"
}
위의 코드처럼 모두 const를 추가해주자.
클래스 컴포넌트에서는 'this.'을 사용했지만,
<div style={this.getStyle(data.completed)} key={data.id}>
함수형 컴포넌트에서는 'this.'을 모두 빼주면 된다.
<div style={getStyle(data.completed)} key={data.id}>
코드에서 'this.' 부분을 모두 삭제해주자.