์ผ ๋๋ todolist๋ง๋ค ์ ์์ด!..
(๊ทผ๋ฐ ์ด์ db์ฐ๊ฒฐ๋ ๊ฐ๋ฅํด์ผ...)
์ค๋๋ ์ญ์๋ ๋
ธ๋ง๋์ฝ๋์ react์ํ์น์ ๋ค์๋๋ฐ..
์ด๋ฒํ์ฐจ๋ todolist ๋ง๋ค๊ธฐ..
์๋ ๋ชจ๋ ๊ฐ๋ฐ์ ๊ธฐ๋ณธ์ todolist์ธ๊ฑธ๊น๋...
์๋ฌดํผ...
์ด์ฌํ ๋ค ๋ฃ๊ณ ์ด์ TIL๋ง ์์ฑํ๋ฉด ๋! ์ด๋ฌ๋๋ฐ...
์ฌ๊น์์ด ๋ค๋ฅธ ์๊ฐ์ ๋๊ธ์ ๋ณด๋ค๊ฐ...
kingoxpo๋ ๋น์ ์ ์ฐพ์๋ด์!!
๊ฐ์ฌํ๋ค๊ณ ํ๊ณ ์ถ๋ค..
๋๋ ์ญ์ ๊ธฐ๋ฅ ํ๋ฌ๊ฐ๋ค..
์ผ๋จ ๊ฐ๋ค..
์ผ๋จ ์ ์ ์ฐ๋ ์ญ์ ๊ธฐ๋ฅ ๋๋ฌด์ง ๋ชจ๋ฅด๊ฒ ์ ,,,
๊ทธ๊ฑฐ ์ฝ๋ ๋ถ์๋ง ๋ง ํ๋ฃจ๋ฅผ ํ๋๋ฐ ์กฐ๋ ๋ชจ๋ฅด๊ฒ ์ด์,,
์ด๋ ค์ฃผ์ธ์,,,
๋ฐฑ๋ ์ฒ๋ ๋ด๋ ๋ชจ๋ฅด๊ฒ ์ด์...
์ด๋ ค์ค,,,
import React, { useState, useEffect } from "react";
function useTodoList() {
const [todoList, setTodoList] = useState([]);
//todolist ์ถ๊ฐํ๋ ํจ์
function addTodo(content) {
if (!todoList.every((todo) => todo.content !== content)) {
//์ถ๊ฐ์ ์ ์ค๋ณต๊ฐ ์ฒดํฌํ๋ ๋ถ๋ถ
alert("๋๊ฐ์ ํ ์ผ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.");
return;
}
setTodoList((oldTodos) => [...oldTodos, { content, done: false }]);
//์์ if๋ฌธ์์ ์ค๋ณต๊ฐ ํ์ธ
}
function checkTodo(targetContent) {
//check๋ ๋ถ๋ถ์ ์ํ๊ฐ ์๋ฃ๋ก ๊ฐ์ ธ๊ฐ๊ธฐ
setTodoList((oldTodos) =>
oldTodos.map((todo) =>
todo.content === targetContent ? { ...todo, done: !todo.done } : todo
)
);
}
function deleteTodo(targetContent) {
//์ญ์ ๊ธฐ๋ฅ
//deleteTodo ํจ์๋ ์ธ์๋ก targetContent๋ฅผ ๋ฐ์ต๋๋ค. ์ด ์ธ์๋ ์ญ์ ๋ฅผ ํ๋ ค๋ ํ ์ผ ํญ๋ชฉ์ ๋ด์ฉ์
๋๋ค.
setTodoList(
(oldTodos) =>
//๊ธฐ์กด๊บผ๋ฅผ ํธ์ถํ๋ค
oldTodos.filter((todo) => todo.content !== targetContent)
//oldTodos.filter๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด์ todoList ๋ฐฐ์ด์์ ์ญ์ ํ๊ณ ์ ํ๋ ํ ์ผ ํญ๋ชฉ์ ์ ์ธํ ์๋ก์ด ๋ฐฐ์ด๋ก ๋ฐํํฉ๋๋ค.
//filter ํจ์ ๋ด๋ถ์์, ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ฌ todo.content !== targetContent์ธ์ง ๊ฒ์ฌํฉ๋๋ค.
//๋ง์ฝ todo.content(ํ ์ผ ํญ๋ชฉ์ ๋ด์ฉ)๊ณผ targetContent(์ญ์ ํ๋ ค๋ ํญ๋ชฉ์ ๋ด์ฉ)์ด ๋ค๋ฅด๋ค๋ฉด, ํด๋น todo ํญ๋ชฉ์ ํฌํจํ๊ณ ,
//๊ฐ๋ค๋ฉด ํด๋น todoํญ๋ชฉ์ ๋ฐฐ์ ํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
);
}
return {
todoList,
addTodo,
checkTodo,
deleteTodo,
};
}
function App() {
const { todoList, addTodo, checkTodo, deleteTodo } = useTodoList();
//๋ณ์๋ก ์์ ํจ์๋ค์ ํธ์ถํจuseTodoList๋ก ํธ์ถํจ
const [todoInput, setTodoInput] = useState("");
function handleChange(e) {
setTodoInput(e.target.value);
}
function handleSubmit(e) {
e.preventDefault();
addTodo(todoInput);
setTodoInput("");
}
//submit๋ฅผ ์ฌ์ฉํ๋ฉด addtodo๊ฐ ๋๋ค
const [selected, setSelected] = useState("all");
//์ ์ ์ํ ์ง์ ํ๋ ํจ์
function handleSelect(e) {
setSelected(e.target.value);
}
const [filteredList, setFilteredList] = useState(todoList);
useEffect(() => {
if (selected === "all") {
setFilteredList(todoList);
} else if (selected === "done") {
setFilteredList(todoList.filter((todo) => todo.done === true));
} else if (selected === "active") {
setFilteredList(todoList.filter((todo) => todo.done === false));
}
}, [selected, todoList]);
return (
<div className="todo">
<div className="top"></div>
<form onSubmit={handleSubmit} className="form">
<label>
<h2>to do list</h2>
<input
type="text"
name="newTodo"
onChange={handleChange}
className="input"
value={todoInput}
></input>
</label>
<button type="submit">โ</button>
</form>
<div className="list">
{filteredList.map((todo, i) => (
<li key={todo.content}>
<input
type="checkbox"
checked={todo.done}
onClick={() => checkTodo(todo.content)}
/>
{todo.content}
<button onClick={() => deleteTodo(todo.content)}>x</button>
</li>
))}
</div>
<select className="w150" onChange={handleSelect}>
<option value="all">์ ์ฒด</option>
<option value="active">์งํ ์ค</option>
<option value="done">์๋ฃ</option>
</select>
</div>
);
}
export default App;
์๋ฌด๋ฆฌ ์ฃผ์์ ๋ฌ๊ณ ๋จ์๋ณ๋ก ๋ถ์ํด๋ ๋ชจ๋ฅด๊ฒ ๋จ๋ง์ผ...
์ผ๋จ ๋ฆฌ์กํธ๋ ๋ฐ๋๊ฒ ๋๋ฌด ๋๋ฌด ๋ง์ด์...
argument๋ฉฐ props๋ฉฐ ํ
์ฃฝ๊ตฌ์ถ๋ค,
์๋ฌดํผ๊ฐ์ ์ด์ฉ ์ ์์ด ๊ธฐ์กด์ ์๋ ๊ฐ์์์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋๋ฐ์,,,
const deleteBtn = (index) => {
setToDos(toDos.filter((item, todoIndex) => index !== todoIndex));
};
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return;
}
์๊พธ
export default App; Line 8:5: 'setTodos' is not defined no-undef
Line 8:14: 'todos' is not defined no-undef
์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค,,
ํ ๋ฏธ์น๊ฒ๋ด,,, ์ด๋ฏธ ์ ์ ๋์ด์๋๋ฐ...
์ ๊ทธ๋ฌ๋๊ฑฐ์ผ...
์ ๋ด ์ค์,,
๋์๋ฌธ์ ๊ตฌ๋ถ๋ชปํ๋ ๋๋ ๋ ์ ;ใ
์ผ๋จ
์ญ์ ๊ฐ๋ฅํ์ ๋๋ค...
๊ทธ๋ฐ๋ฐ๋ง์
๋๋ค,,,
์ ๋ฑ๋กํ ์์๋๋ก to do list๊ฐ ๋ฑ๋ก๋๊ธธ ์ํ๋๋ฐ..
์ด์ํ ์์๋ผ๋,,,
๊ทธ๋์
์ด ๊ธ์๋ณด๊ณ
<ul>
{toDos.reverse().map((item, index) => (
<li key={index}>
{item}
<button onClick={() => deleteBtn(index)}>โ</button>
</li>
))}
</ul>
์ด๋ ๊ฒ ์์ฑํ๋๋ ๊ทธ๋ฅ ๊ฐ์ด ์์ ์์๋๋ก ๋์ค๋๊ฑฐ๋๋ผ๊ณ ์...
์ด๋ ๊ฒ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์์๋ค..
ํ..
import { useState } from "react";
function App() {
const [toDo, setToDo] = useState("");
const [toDos, setToDos] = useState([]);
const onChange = (event) => setToDo(event.target.value);
const deleteBtn = (index) => {
setToDos(toDos.filter((item, todoIndex) => index !== todoIndex));
};
const onSubmit = (event) => {
event.preventDefault();
if (toDo === "") {
return;
}
//toDo = "" state๋ฅผ ์ง์ ์์ ํ ์ ์์ด์ ํจ์๋ฅผ ์ฌ์ฉํด์ ํจ์๋ก ์์ ํจ ์ ๋ ์ด๋ฐ์์ผ๋ก ์ง์ ์ ์ผ๋ก ํจ์๋ฅผ ์์ ํ๋ฉด ์๋
setToDos((currentArray) => [...currentArray, toDo]); // ์ง์ ์ ์ผ๋ก ๊ฐ์ ์์ ํ๊ฑฐ๋ ํจ์๋ฅผ ๋ฃ์ ์ ์์ /๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด์ ํจ์๋ก ๋ฐ์๊บผ์
//array [] ์ฌ๊ธฐ์ ๊ธฐ์กด์ ์๋ ์ด๋ ์ด๋ฅผ [new(์๋ก์ด๊ฐ,) ์ด๋ ์ด๋ช
]์ด๋ ๊ฒํ๋ฉด ๊ฑ ์ด์ํ ๊ฐ์ด ๋ค์ด๊ฐ ์ด๋ ์ด๋
setToDo(""); // setTodo๋ value๋ฅผ ์์ ํ๋ ๊ธฐ๋ฅ์ด๊ณ todoinput์ด๋ ์ฐ๊ฒฐ๋์ด ์์ด์ input์ฐฝ ์ด๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค "" ๋น๋ฌธ์์ด์ ๋ฃ์ด์ค์ผ ์ธํ์ฐฝ ์ด๊ธฐํ ๊ฐ๋ฅํ.
};
console.log(toDo);
console.log(toDos);
return (
<div>
<h1>my to dos ({toDos.length})</h1>
{/* js์ฝ๋๋ฅผ ์ฐ๊ธฐ์ํด์๋ ์ด ์ฃผ์์ฒ๋ผ {} ๊ผญ ํ์ํ
*/}
<form onSubmit={onSubmit}>
<input
onChange={onChange}
value={toDo}
type="Text"
placeholder="write your to do."
/>
<button>Add To Do</button>
<hr />
<ul>
{toDos.map((item, index) => (
<li key={index}>
{item}
<button onClick={() => deleteBtn(index)}>โ</button>
</li>
))}
</ul>
{/* JS์์์ map๊ธฐ๋ฅ ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ ๊ฐ๊ฐ์ elements๋ค์ ๋ฐ๊ฟ ์ ์๋๋ก ํด์ค๋ค. */}
{/* map์ [apple,banana, habana, oh nana].map(()์ด๋ถ๋ถ์ ์ฒซ๋ฒ์งธ argument๋ก ํ์ฌ์ item์ ๊ฐ์ง๊ณ ์ฌ ์ ์์=> "hello"))
์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋ฐฐ์ด์ ๋ชจ๋ elements๋ค์ด hello๋ก ๋ฐ๋ */}
{/* map์ [apple,banana, habana, oh nana].map((item)=> item.toUpperCase()))
์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋ฐฐ์ด์ ๋ชจ๋ elements๋ค์ ์ฒซ๋ฒ์งธ ๊ธ์๊ฐ ๋๋ฌธ์๋ก ๋ฐ๋ */}
</form>
</div>
);
}
// react.js๋ component๊ฐ ์ฃฝ์ ๋๋ ์ฝ๋๋ฅผ ์คํํ ์ ์์ด์ฉ
export default App;
์ด์! ์๋ฃํ๋๋ฐ ๊ธ์..
์ด๋ ๊ฒ css๋ ์ด์๊ณ velog๋ ์ ์ฐ์๋ค๋..
์๊ทน๋ฐ์์ ์ ๋ ์ ๋ฟ์บ ์จ๋ณผ๋ ต๋๋ค.
์ค๋ ์ด์.