์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ์๋ฐ์คํฌ๋ฆฝํธ
- ๊ฐ์ดํ ์ข ๋ญ๊ฐ๋น
- ๋ ์
- ์ฑ
- ์ค๋ธ์
- ์ฝ๋ฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- JavaScript
- database
- Java
- K๋ฐฐํฐ๋ฆฌ๋ ๋ณผ๋ฃจ์
- ๋๊ฐ
- ํ์ด์ฌ
- ์ํ์ฃผ
- ํ์ฒ์ ๋ฆฌํธ๋ฆฌํธ
- ๊น๋ฏธ๊ฒฝ์๋งํ์์
- ์นดํ๋๊ฐ
- html
- ๊ฐ๋ฐ
- ํ๋ก๊ทธ๋๋ฐ
- ์ํ
- ์ค๋ผํด
- css
- ์ ๋ฆฌํธ๋ฆฌํธ
- ๋ฐฐ์์ ๋ฐฐ์
- ์นํผ๋ธ๋ฆฌ์ฑ
- ์๋ฐ
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- Python
- ๋ฐ์ํ
- Today
- Total
JiYoung Dev ๐ฅ
[React] To-do List ๋ง๋ค๊ธฐ (2023.05.23) ๋ณธ๋ฌธ
๐ ๊ตฌ์ฑํ๊ธฐ
๐ ์ปดํฌ๋ํธ
1. TodoList
2. TodoItem
3. TodoInput
๐ ์ปจํ ์คํธ - TodoContext
์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ
1. todos : ๋ด์ฉ, ์๋ฃ์ฌ๋ถ (๊ฐ์ฒด๋ก ์ ์ฅ)
2. newTodo : ๋ด์ฉ
๐ ์ฝ๋ ์์ฑํ๊ธฐ (์์)
1) ํ๋ฉด์ ์ฒซ Todo ๋ณด์ด๊ฒ ํ๊ธฐ
์ปดํฌ๋ํธ ์ฐ๊ฒฐ
์ปจํ ์คํธ ์ฐ๊ฒฐ
์ปจํ ์คํธ๋ก ์ฌ์ฉํ ๊ฐ state๋ก ์ ์ฅ ํ ์ด๊น๊ฐ ์ง์ ํ์ฌ ์ถ๋ ฅ๋๋๋ก
2) ์ ๋ ฅ์ฐฝ์ ๊ธ์จ๋ฅผ ์ ๋ ฅํ๋ฉด newTodo์ ์ ์ฅ
handleNewTodo()
3) Add ๋ฒํผํด๋ฆญ์ Todos์ newTodo ๊ฐ์ฒด ์ถ๊ฐ, input ํ ์คํธ ์ฐฝ ๊ณต๋ฐฑ์ผ๋ก
addNewTodo()
4) add ๋ฒํผ ํด๋ฆญ์ ์ถ๊ฐ๋ ๊ฐ์ฒด ํ๋ฉด์ ๋์ฐ๊ธฐ
addNewTodo()
5) delete ํด๋ฆญํ๋ฉด ํด๋น ๋ฆฌ์คํธ ์ญ์
deleteTodo()
6) ์ฒดํฌ ๋ฐ์ค ์ฒดํฌ๋๋ฉด ์ทจ์์ ํ์
handleCheck()
๐ ์ฝ๋
๐ App.js
import { useState } from 'react';
import './App.css';
import TodoInput from './components/TodoInput';
import TodoList from './components/TodoList';
import { TodosContext } from './context/TodosContext';
function App() {
const [ todos, setTodos ] = useState([{text : '์ฒซ Todo', completed : false}])
const [ newTodo, setNewTodo ] = useState('')
const handleNewTodo = (e)=>{
setNewTodo(e.target.value);
}
const addNewTodo = ()=>{
setTodos([...todos, {text : newTodo, completed : false}])
setNewTodo('')
}
const deleteTodo = (index)=>{
const newTodos = [...todos];
newTodos.splice(index, 1);
setTodos(newTodos);
}
const handleCheck = (index)=>{
const newTodos = [...todos];
newTodos[index].completed = !newTodos[index].completed;
setTodos(newTodos);
}
return (
<TodosContext.Provider value={{todos, setTodos, newTodo, setNewTodo, handleNewTodo, addNewTodo, deleteTodo, handleCheck}} >
<div>
<h1>Todo List</h1>
<TodoList />
<TodoInput />
</div>
</TodosContext.Provider>
);
}
export default App;
๐ TodosContext.js
import { createContext } from "react";
export const TodosContext = createContext(null);
๐ components 1. TodoList.jsx
import React, { useContext } from 'react'
import TodoItem from './TodoItem'
import { TodosContext } from '../context/TodosContext'
const TodoList = () => {
const { todos } = useContext(TodosContext)
return (
<div>
{todos.map((item, idx)=>(
<TodoItem key={item.text+idx} index={idx} todo={item}/>
))}
</div>
)
}
export default TodoList
๐ components 2. TodoItem.jsx
import React, { useContext } from 'react'
import { TodosContext } from '../context/TodosContext';
const TodoItem = ({index, todo}) => {
const { deleteTodo, handleCheck } = useContext(TodosContext);
return (
<div>
<input id="todo-item" type="checkbox" onChange={()=>{handleCheck(index)}} />
<lable htmlFor="todo-item" style={{
textDecoration: todo.completed ? "line-through" : "none"
}}>{todo.text}</lable>
<button onClick={()=>{deleteTodo(index)}}>Delete</button>
</div>
)
}
export default TodoItem
๐ components 3. TodoInput.jsx
import React, { useContext } from 'react'
import { TodosContext } from '../context/TodosContext'
const TodoInput = () => {
const {handleNewTodo, addNewTodo, newTodo} = useContext(TodosContext)
return (
<div>
<input type="text" onChange={handleNewTodo} value={newTodo}/>
<button onClick={addNewTodo}>Add</button>
</div>
)
}
export default TodoInput
๐ ์ฐธ๊ณ ์ฌํญ
- handleTodoAddition ์ด๋ผ๋ ํจ์๋ฅผ ์์ฑ
=> ๊ธฐ์กด์ ์๋ todos ์ newTodos ๋ผ๋ ๊ฐ์ ์ถ๊ฐ
=> ** state๋ฅผ ๋์ ์ํค๋ ๋ฐฉ๋ฒ!
=> const [txt, setTxt] = useState("ํ์ด")
Q. ํ์ด => ๋ฐ์ด
setTxt("๋ฐ์ด");
Q. ํ์ด => ํ์ดํ์ด
setTxt([...txt, "ํ์ด"])
=> ๊ธฐ์กด์ ์๋ todos์ newTodo ๋ฅผ ๋ํด๋ณด๋ฉด?
setTodos([...todos, {text : newTodo , completed : false }])
/*
[์๋ฌ ์ฝ์ด๋ณด๊ธฐ!]
useState is not defined
useContext is not defined
=> import ์ํด์ค์ ๋๋ ์ค๋ฅ
ck is no defined
=> ck ๋ผ๋ ํจ์, ํน์ ๋ณ์๋ฅผ ์ค์ ํ์ง X
React Hook "useState" cannot be called at the top level.
=> use ~ ๋ฆฌ์กํธ ํ
์ ๋ฐ๋์ ์ปดํฌ๋ํธ ๋ด์ ์์ฑ
*/
'Study > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Lifecycle (2023.05.24) (0) | 2023.05.24 |
---|---|
[React] useRef (2023.05.24) (0) | 2023.05.24 |
[React] context API (2023.05.22) (0) | 2023.05.22 |
[React] React ๋ณต์ต (๊ฐ๋ ~ context API๊น์ง) (2023.05.22) (0) | 2023.05.22 |
[React] Component, Props, State (2023.05.16) (0) | 2023.05.16 |