๐ 2024. 03. 28 74์ผ์ฐจ
TodoListItem: ํ ์ผ ๋ชฉ๋ก์์ ๊ฐ๋ณ ํญ๋ชฉ์ ํ์ํ๋ ์ปดํฌ๋ํธ. todo ๊ฐ์ฒด๋ฅผ ๋ฐ์์์ ํด๋น ํญ๋ชฉ์ ์ ๋ชฉ๊ณผ ID๋ฅผ ํ์ํ๊ณ , ์ญ์ ๋ฒํผ์ ํด๋ฆญํ ๋ removeTodo ํจ์๋ฅผ ํธ์ถํ์ฌ ํด๋น ํญ๋ชฉ์ ์ญ์ .
TodoList: ํ ์ผ ๋ชฉ๋ก์ ํ์ํ๋ ์ปดํฌ๋ํธ. todos ๋ฐฐ์ด์ ๋ฐ์์์ ๋ฐฐ์ด์ ๊ธธ์ด์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ด์ฉ์ ํ์. ํ ์ผ์ด ์์ ๊ฒฝ์ฐ "ํ ์ผ ์์" ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ , ํ ์ผ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ ํ ์ผ ํญ๋ชฉ์ TodoListItem์ผ๋ก ๋ ๋๋ง. TodoListItem props์ removeTodo ์ถ๊ฐ
App: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฉ์ธ ์ปดํฌ๋ํธ. NewTodoForm ์ปดํฌ๋ํธ๋ฅผ ํตํด ์๋ก์ด ํ ์ผ์ ์ถ๊ฐํ๊ณ , ๊ทธ ํ๋จ์ TodoList ์ปดํฌ๋ํธ๋ฅผ ํตํด ํ ์ผ ๋ชฉ๋ก์ ํ์. ๋ํ, ํ ์ผ ํญ๋ชฉ์ ์ญ์ ํ๊ธฐ ์ํ removeTodo ํจ์๋ฅผ TodoList ์ปดํฌ๋ํธ๋ก ์ ๋ฌ.
//์๋ต
const TodoListItem = ({ todo, removeTodo: _removeTodo }) => {
const removeTodo = () => {
_removeTodo(todo.id);
};
return (
<li className="flex items-center gap-x-3 mb-3">
<span className="badge badge-primary badge-outline">{todo.id}</span>
<span>{todo.title}</span>
<button className="btn btn-primary" onClick={removeTodo}>
์ญ์
</button>
</li>
);
};
const TodoList = ({ todos, removeTodo }) => {
return (
<>
{todos.length == 0 ? (
<h4>ํ ์ผ ์์</h4>
) : (
<>
<h4>ํ ์ผ ๋ชฉ๋ก</h4>
<ul>
{todos.map((todo) => (
<TodoListItem key={todo.id} todo={todo} removeTodo={removeTodo} />
))}
</ul>
</>
)}
</>
);
};
const App = () => {
//์๋ต
const removeTodo = (id) => {
const newTodos = todos.filter(todo => todo.id != id);
setTodos(newTodos);
};
return (
<>
<NewTodoForm addTodo={addTodo} />
<hr />
<TodoList todos={todos} removeTodo={removeTodo} />
</>
);
};
//์๋ต
๋ฆฌ์กํธ(React), ์์ดํ ์ญ์ ๊ตฌํ
TodoListItem editMode ์ํ์ newTodoTitle ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋ชจ๋์ธ์ง ํ์ธํ๊ณ ์์ ํ ๋ด์ฉ์ ๊ด๋ฆฌ.
enableEditMode: ์์ ๋ชจ๋๋ก ์ ํํ๋ ํจ์.
cancelEdit: ์์ ์ ์ทจ์ํ๊ณ ์ด์ ๋ด์ฉ์ผ๋ก ๋๋๋ฆฌ๋ ํจ์.
commitEdit: ์์ ๋ ๋ด์ฉ์ ๋ฐ์ํ๊ณ ์์ ๋ชจ๋๋ฅผ ์ข
๋ฃํ๋ ํจ์.
์ผํญ์ ์ฌ์ฉ readMode๊ฐ true๋ฉด ์์ ์ญ์ (์ผ๋ฐ๋ชจ๋)๋ก false๋ฉด ์์ ์๋ฃ, ์์ ์ทจ์(์์ ๋ชจ๋)๋ก ์ ํ
App ์ปดํฌ๋ํธ์ modifyTodo ํจ์ ์ ์ธ todos ๋ฐฐ์ด์์ ํน์ id๋ฅผ ๊ฐ์ง ํญ๋ชฉ๋ง ๊ทธ ์ ๋ชฉ์ ์๋ก์ด ๊ฐ์ผ๋ก ์์ ํ๊ณ , ๋๋จธ์ง ํญ๋ชฉ๋ค์ ๊ทธ๋๋ก ์ ์ง. React์์ ์ด๋ ๊ฒ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ์์ ๋ todos ๋ฐฐ์ด์ ๋ฐ์ํ์ฌ ๋ฆฌ๋ ๋๋ง.
//์๋ต
const TodoListItem = ({
//์๋ต
modifyTodo: _modifyTodo
}) => {
const [editMode, setEditMode] = useState(false);
const [newTodoTitle, setNewTodoTitle] = useState(todo.title);
const readMode = !editMode;
const enableEditMode = () => {
setEditMode(true);
};
//์๋ต
const cancleEdit = () => {
setEditMode(false);
setNewTodoTitle(todo.title);
};
const commitEdit = () => {
if (newTodoTitle.trim().length == 0) return;
_modifyTodo(todo.id, newTodoTitle.trim());
setEditMode(false);
};
return (
<li className="flex items-center gap-x-3 mb-3">
<span className="badge badge-accent badge-outline">{todo.id}</span>
{readMode ? (
<>
<span>{todo.title}</span>
<button className="btn btn-outline btn-accent" onClick={enableEditMode}>
์์
</button>
<button className="btn btn-accent" onClick={removeTodo}>
์ญ์
</button>
</>
) : (
<>
<input
className="input input-bordered"
type="text"
placeholder="ํ ์ผ ์จ"
value={newTodoTitle}
onChange={(e) => setNewTodoTitle(e.target.value)}
/>
<button className="btn btn-accent" onClick={commitEdit}>
์์ ์๋ฃ
</button>
<button className="btn btn-accent" onClick={cancleEdit}>
์์ ์ทจ์
</button>
</>
)}
</li>
);
};
const TodoList = ({ todos, removeTodo, modifyTodo }) => {
return (
<>
{todos.length == 0 ? (
<h4>ํ ์ผ ์์</h4>
) : (
<>
<h4>ํ ์ผ ๋ชฉ๋ก</h4>
<ul>
{todos.map((todo) => (
<TodoListItem
key={todo.id}
todo={todo}
removeTodo={removeTodo}
modifyTodo={modifyTodo}
/>
))}
</ul>
</>
)}
</>
);
};
const App = () => {
//์๋ต
const modifyTodo = (id, title) => {
const newTodos = todos.map((todo) =>
todo.id != id ? todo : { ...todo, title }
);
setTodos(newTodos);
};
return (
<>
<NewTodoForm addTodo={addTodo} />
<hr />
<TodoList todos={todos} removeTodo={removeTodo} modifyTodo={modifyTodo} />
</>
);
};
//์๋ต
๋ฆฌ์กํธ(React), ์์ดํ ์์ ์ input ๊ฐ๋ฅํ๋๋ก, ์์ ์๋ฃ
const useTodoStatus = () => {
const [todos, setTodos] = useState([]);
const [lastTodoId, setLastTodoId] = useState(0);
const addTodo = (title) => {
const id = lastTodoId + 1;
const newTodo = {
id,
title
};
setTodos([...todos, newTodo]);
setLastTodoId(id);
};
const removeTodo = (id) => {
const newTodos = todos.filter((todo) => todo.id != id);
setTodos(newTodos);
};
const modifyTodo = (id, title) => {
const newTodos = todos.map((todo) =>
todo.id != id ? todo : { ...todo, title }
);
setTodos(newTodos);
};
return{
todos,
addTodo,
removeTodo,
modifyTodo
};
}
const todoStatus = useTodoStatus();
๋ฆฌ์กํธ(React), ๊ด๋ จ๋ state๋ฅผ ํ๋๋ก ๋ฌถ๊ธฐ, ๋ฆฌ์กํธ ์ปค์คํ ํ
//์๋ต
// ๊ธฐ์กด ๋ฐฉ์
// setTodos([...todos, newTodo]);
// immer ์ ์ฉ
setTodos(
produce(todos, (draft) => {
draft.push(newTodo);
})
);
setLastTodoId(id);
// ๊ธฐ์กด ๋ฐฉ์
// const newTodos = todos.filter((todo) => todo.id != id);
// immer ์ ์ฉ
const newTodos = produce(todos, (draft) => {
const index = draft.findIndex((todo) => todo.id == id);
draft.splice(index, 1);
});
setTodos(newTodos);
// ๊ธฐ์กด ๋ฐฉ์
// const newTodos = todos.map((todo) =>
// todo.id != id ? todo : { ...todo, title }
// );
// immer ์ ์ฉ
const newTodos = produce(todos, (draft) => {
const index = draft.findIndex((todo) => todo.id == id);
draft[index].title = title;
});
setTodos(newTodos);
๋ฆฌ์กํธ(React), immer ์ ์ฉ
formInputNoRef: ์ด ์ฐธ์กฐ๋ ์ ๋ ฅ ์์๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ.
input ์์ ref={formInputNoRef} ์ ์ฉ
formInputNoRef.current.value = '123'; formInputNoRef.current.focus();
์ซ์ ์
๋ ฅํ์ง ์์์ ๋ input์ฐฝ ํฌ์ปค์ฑ, input์ฐฝ ๋ฒจ๋ฅ ๊ฐ '123'์ผ๋ก ์ค์ current ์ด์ฉ
import React, { useState, useRef } from "https://cdn.skypack.dev/react@18";
const App = () => {
const formInputNoRef = useRef(null);
const [number,setNumber] = useState('');
const notice = () => {
if(!number) {
alert('์ซ์ ์
๋ ฅํด');
formInputNoRef.current.value = '123';
formInputNoRef.current.focus();
return;
}
alert(`๋ค๊ฐ ์
๋ ฅํ ์ซ์๋ ${number}์ผ.`);
setNumber('');
}
return (
<>
<form onSubmit={(e) => {
e.preventDefault();
notice();
}}>
<input
ref={formInputNoRef}
className="input input-bordered"
type="text"
placeholder="์ซ์ ์
๋ ฅ"
value={number}
onChange={(e) => setNumber(e.target.value)}
/>
<button className="btn btn-primary">์ถ๊ฐ</button>
</form>
</>
);
};
๋ฆฌ์กํธ(React), useRef๋ฅผ ์ฌ์ฉํด์ dom ์กฐ์ํ๊ธฐ
import React, { useState, useEffect } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
let AppCallCount = 0;
const App = () => {
console.log("์์");
useEffect(() => {
AppCallCount++;
console.log(`1App์ด ${AppCallCount}๋ฒ ์คํ`);
}, []); // [] : ์์กด์ฑ ๋ฐฐ์ด
// 1. ๋น ๋ฐฐ์ด์ด ์์ผ๋ฉด useEffect ์์ ์๋ ๋ก์ง์ ๋ฆฌ๋๋๋ง ๋๋ค.
// 2. ๋น ๋ฐฐ์ด์ด ์์ผ๋ฉด useEffect ์์ ์๋ ๋ก์ง์ ํ๋ฒ๋ง ์คํ๋๋ค.
useEffect(() => {
AppCallCount++;
console.log(`2App์ด ${AppCallCount}๋ฒ ์คํ`);
});
console.log("๋");
const [no, setNo] = useState(0);
return (
<>
<button onClick={() => setNo(no + 1)}>์ฆ๊ฐ : {no}</button>
</>
);
};
import React, {
useState,
useRef,
useEffect
} from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
let AppCallCount = 0;
const App = () => {
AppCallCount++;
console.log(`1App์ด ${AppCallCount}๋ฒ ์คํ`);
const inputNameRef = useRef(null);
const inputAgeRef = useRef(null);
const [no, setNo] = useState(0);
// setTimeout(() => inputNameRef.current.focus());
useEffect(()=>{
inputNameRef.current.focus();
},[]);
return (
<>
<input ref={inputNameRef} type="text" placeholder="์ด๋ฆ" />
<hr />
<input ref={inputAgeRef} type="number" placeholder="๋์ด" />
<hr />
<button
onClick={() => {
setNo(no + 1);
inputAgeRef.current.focus();
}}
>
์ฆ๊ฐ : {no}
</button>
</>
);
};
immer๋ ๊ธฐ๋ณธ์ ์ผ๋ก produce ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ค. ํ๋ผ๋ฏธํฐ์ ๊ฐ์์ ๋ฐ๋ผ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
2๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ ๋๋ 1๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์์ ํ ์ํ, 2๋ฒ์งธ ํ๋ผ๋ฏธํฐ์๋ ์ด ์ํ๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธํ ๊ฑด์ง๋ฅผ ์ ์ํ๋ recipe ํจ์์ด๋ค. ๋ณ๊ฒฝ๋ ์๋ก์ด ์ํ๊ฐ ๋ฐํ๋๋ค.
import produce from 'immer';
const nextState = produce(baseState, (draft) => {
draft[1].done = true;
draft.push({ title: 'Tweet about it' });
});
ํ๋ผ๋ฏธํฐ๋ฅผ ํ๋๋ง ์ฌ์ฉํ๋ฉด ์ํ๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธํ ์ง ๊ฒฐ์ ํ๋ recipe ํจ์๋ง์ ๋๊ธฐ๋ฉฐ ์ด๋๋ ํด๋น ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ํจ์๊ฐ ๋ฐํ๋๋ค.
import produce from 'immer';
const toggleTodo = produce((draft, id) => {
const todo = draft.find((todo) => todo.id === id);
todo.done = !todo.done;
});
const baseState = [ ... ];
const nextState = toggleTodo(baseState, 'Immer');
immer์ ํต์ฌ ์๋ฆฌ๋ Copy-on-write(์ดํ ๊ธฐ๋ก ์ค ๋ณต์ฌ)์ Proxy(์ดํ ํ๋ก์)์ ์๋ค. ๊ธฐ๋ก ์ค ๋ณต์ฌ๋ ์์์ ๊ณต์ ํ๋ค๊ฐ๋ ์์ ํด์ผ ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฉด ์์์ ๋ณต์ฌ๋ณธ์ ์ฐ๊ฒ ํ๋ ๊ฐ๋ ์ด๋ค. immer๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ ์๋ณธ ๊ฐ์ฒด์ธ ์ํ ๊ฐ์ฒด ๋์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋์ ์กฐ์(๋ณ๊ฒฝ) ํ๋ ๊ฒ์ด๋ค.
console.clear();
import React, { useState } from "https://cdn.skypack.dev/react@18";
import ReactDOM from "https://cdn.skypack.dev/react-dom@18";
import immer, { produce } from "https://cdn.skypack.dev/immer";
const App = () => {
const [todos, setTodos] = useState([
{ id: 1, title: "์ ๋ชฉ1" },
{ id: 2, title: "์ ๋ชฉ2" }
]);
const addTodo = () => {
// const newTodos = [...todos, {id:3, title:"์ ๋ชฉ3"}];
const newTodos = produce(todos, (draft) => {
draft.push({ id: 3, title: "์ ๋ชฉ3" });
});
setTodos(newTodos);
};
const modifyTodo = () => {
// const newTodos = todos.map((todo) => todo.id != 1 ? todo : {...todo,title:"zxcv"});
// ์ค๋ฌด์ฝ๋
setTodos(produce(todos, (draft) => {
draft[1].title = "zxcv";
}));
};
const removeTodo = () => {
// const newTodos = todos.filter((todo,index) => index != 1);
const newTodos = produce(todos, (draft) => {
draft.splice(1, 1);
});
setTodos(newTodos);
};
return (
<>
todos : {JSON.stringify(todos)}
<hr />
<button onClick={addTodo}>์ถ๊ฐ</button>
<button onClick={modifyTodo}>์์ </button>
<button onClick={removeTodo}>์ญ์ </button>
</>
);
};
ReactDOM.render(<App />, document.getElementById("root"));
splice() ๋ฉ์๋๋ ๋ฐฐ์ด์ ๊ธฐ์กด ์์๋ฅผ ์ญ์ ๋๋ ๊ต์ฒดํ๊ฑฐ๋ ์ ์์๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐฐ์ด์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ค.
ํ๋๋ ์ ๊ฑฐํ์ง ์๊ณ , 2๋ฒ ์ธ๋ฑ์ค์ "drum" ์ถ๊ฐ
var myFish = ["angel", "clown", "mandarin", "sturgeon"];
var removed = myFish.splice(2, 0, "drum");
// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]
// removed is [], no elements removed
var myFish = ["angel", "clown", "mandarin", "sturgeon"];
var removed = myFish.splice(2, 0, "drum", "guitar");
// myFish is ["angel", "clown", "drum", "guitar", "mandarin", "sturgeon"]
// removed is [], no elements removed
var myFish = ["angel", "clown", "drum", "mandarin", "sturgeon"];
var removed = myFish.splice(3, 1);
// removed is ["mandarin"]
// myFish is ["angel", "clown", "drum", "sturgeon"]
var myFish = ["angel", "clown", "drum", "sturgeon"];
var removed = myFish.splice(2, 1, "trumpet");
// myFish is ["angel", "clown", "trumpet", "sturgeon"]
// removed is ["drum"]
var myFish = ["angel", "clown", "drum", "sturgeon"];
var removed = myFish.splice(2);
// myFish is ["drum", "sturgeon"]
findIndex() ํจ์๋ ๋ฐฐ์ด์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ์ฐพ์ ์ฒซ ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ ํจ์๋ค.
๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ์กฐ๊ฑด์ ์์๋ฅผ ์ฐพ๋๋ค. ์ด ํจ์๋ ๋ฐฐ์ด์์ ํน์ ์์์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ ๋ฐ ์ ์ฉํ๋ค.
์์ (๋ฐฐ์ด์์ findIndex() ํจ์๋ก "green"์ ์ธ๋ฑ์ค ์ฐพ๊ธฐ)
// ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค.
const colors = ["red", "green", "blue"];
// ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํ ์ฝ๋ฐฑ ํจ์
function findGreen(color) {
return color === "green"; // ๋ฐฐ์ด ์์๊ฐ "green"๊ณผ ๊ฐ์์ง ํ์ธํฉ๋๋ค.
};
// ๋ฐฐ์ด์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ฐพ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
const green = colors.findIndex(findGreen);
// ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
console.log(green); // ์ถ๋ ฅ: 1
import { useRef } from 'react';
function MyComponent() {
const intervalRef = useRef(0);
const inputRef = useRef(null);
// ...
๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด ์์ฒ๋ผ ๊ฐ์ฅ ์ต์๋จ์ useRef๋ฅผ ์ ์ธํด์ค ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค.
useEffect๋ component๊ฐ mount๋์ ๋, component๊ฐ update ๋์ ๋, ํน์ ์์
์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฆ, ํด๋์คํ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์์๋ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํจ์ํ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
๊ธฐ๋ณธ ํํ : useEffect(functionm deps)
import React, {useEffect} from 'react';
useEffect ํจ์ ๋ถ๋ฌ์ค๊ธฐ
useEffect(() => {
console.log('๋ง์ดํธ ๋ ๋๋ง ์คํ๋๋ค.')
}, []);
- ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๊ฐ์ฅ ์ฒ์ ๋๋๋ง ๋ ๋ ํ ๋ฒ๋ง ์คํํ๊ณ ์ถ์ ๋๋ deps ์์น์ ๋น ๋ฐฐ์ด์ ๋ฃ๋๋ค.
useEffect(() => {
console.log('๋๋๋ง ๋ ๋ ๋ง๋ค ์คํ๋๋ค.')
});
- ๋ง์ฝ ๋ฐฐ์ด์ ์๋ตํ๋ค๋ฉด ๋ฆฌ๋๋๋ง ๋ ๋๋ง๋ค ์คํ๋๋ค.
useEffect(() => {
console.log(name)
console.log('์
๋ฐ์ดํธ ๋ ๋ ์คํ๋๋ค.')
}, [name]);
- ํน์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋ ๋ ์คํํ๊ณ ์ถ์ ๋๋ deps ์์น์ ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
- ์
๋ฐ์ดํธ ๋ ๋๋ง ์คํ๋๋ ๊ฒ์ด ์๋๋ผ ๋ง์ดํธ ๋ ๋๋ ์คํ๋๋ค. ์
๋ฐ์ดํธ ๋ ๋๋ง ์คํ๋๊ฒ ํ๊ณ ์ถ์ผ๋ฉด
//์๋ต
const mounted = useRef(false);
useEffect(() => {
if(!mounted.current){
mounted.current = true;
}else{
//ajex
}
},[๋ฐ๋๋ ๊ฐ]);
//์๋ต
- ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋๋ if ๋ฌธ์์ ์๋ฌด๊ฒ๋ ์คํํ์ง ์๊ณ mounted ๊ฐ๋ง ๋ฐ๊ฟ์ฃผ๊ณ ,
else์์ ๋ฐฐ์ด ์์ ์๋ ๊ฐ์ด ๋ฐ๋๋ฉด, ajex ์๋ฒ ํต์ ์ด๋ผ๋์ง ์ํ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
useEffect(() => {
console.log('effect')
console.log(name)
return () => {
console.log('cleanup');
console.log(name)
};
}, []);
- cleanup ํจ์ ๋ฐํ (return ๋ค์ ๋์ค๋ ํจ์์ด๋ฉฐ, useEffect์ ๋ํ ๋ท์ ๋ฆฌ ํจ์)
- ์ธ๋ง์ดํธ ๋ ๋๋ง cleanup ํจ์๋ฅผ ์คํํ๊ณ ์ถ์ ๋ :๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋น ๋ฐฐ์ด์ ๋ฃ๋๋ค.
- ํน์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋๊ธฐ ์ง์ ์ cleanup ํจ์๋ฅผ ์คํํ๊ณ ์ถ์ ๋ :deps ๋ฐฐ์ด ์์ ๊ฒ์ฌํ๊ณ ์ถ์ ๊ฐ์ ๋ฃ์ด์ค๋ค.
deps์ ํน์ ๊ฐ์ ๋ฃ๊ฒ ๋๋ค๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ง์ดํธ ๋ ๋, ์ง์ ํ ๊ฐ์ด ๋ฐ๋ ๋, ์ธ๋ง์ดํธ ๋ ๋, ๊ฐ์ด ๋ฐ๋๊ธฐ ์ง์ ์ ๋ชจ๋ ํธ์ถ์ด ๋๋ค.
useEffect ์์์ ์ฌ์ฉํ๋ ์ํ๋, props๊ฐ ์๋ค๋ฉด, useEffect์ deps์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด ๊ท์น์ด๋ค.
๋ง์ฝ ์ฌ์ฉํ๋ ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์๋๋ค๋ฉด, useEffect์์ ํจ์๊ฐ ์คํ๋ ๋ ์ต์ ์ํ, props๋ฅผ ๊ฐ๋ฆฌํค์ง ์๋๋ค.
deps ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ตํ๋ค๋ฉด, ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋๋๋ง ๋ ๋๋ง๋ค useEffect ํจ์๊ฐ ํธ์ถ๋๋ค.