let's get IT with DAVINA ๐ป
React๋ก TodoApp ๋ง๋ค๊ธฐ (1)Setup ๋ณธ๋ฌธ
๋ถํธ์บ ํ๊ฐ ๋๋๊ณ ๋ง์ ์ฌ๋๋ค์ด ๋ ์ฌํ๋๊ณ , ์๋ก์ด ์ธ์ด ๊ธฐ๋ฐ์ผ๋ก, ๋ ์ด๋ ค์ด ์์ค์ ์ถ๊ฐ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋ ๋ฏ ํ์ฌ ๋๋จํด๋ณด์ธ๋ค.. ๋ฌผ๋ก ์ฝ๋ฉ์ด๋๊ฑธ ์ฒ์ ์์ํ์ ๋ "๋"๋ณด๋ค๋ ํ์ฌ์ "๋ด"๊ฐ ๋ ๋ฐ์ ํด์๋ ๋ชจ์ต์ด๊ณ , ๋ถ์ํดํ์ง ๋ง์๊ณ ๋งค์ผ ๋ค์งํ์ง๋ง ๋ ๋ด๊ฐ ๊ธฐ๋ณธ๊ธฐ๊ฐ ์ฌ์ ํ ๋ง์ด ๋ถ์กฑํ๊ตฌ๋๋ฅผ ๊ณ์ ๊นจ๋ฌ์ผ๋ฉฐ ๋ง์ด ์ข์ ํ๋ ์์ฆ์ธ๊ฒ๊ฐ๋ค.. ๊ทธ ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฐ๊ฑด ํ๋์ ํํ์ด์ง๋ฅผ ๋ง๋ค ๋, CRUD๋ฅผ ์ ๋ง ์๋ฒฝํ๊ฒ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋๊ฐ๋ฅผ ์ค์ค๋ก์๊ฒ ๋ฌผ์ด๋ณธ๋ค๋ฉด ๋๋ฌด๋๋ ๋น์ฐํ NO์๋ค.. ๊ทธ๋์ ๋ ๋ ์ด๋ ต๊ธฐ๋ณด๋จ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ค์ ํ ๋ฒ ๋ฆ๊ณ ์ ํ๋ก์ ํธ ์ ๋ถํธ์บ ํ์์ ๊ณผ์ ๋ก ์คฌ๋ (๋ ์คํจํ๋) Todo App์ ๋ค์ ํ๋ฒ ๋ง๋ค์ด๋ณด๊ณ ์ ์์ํ๋ค.
1. React Component ๋ง๋ค๊ธฐ
React๋ก ๊ฐ๋ฐ ์์ํ๊ธฐ
npx create-react-app todo-bin
- Template.js & Template.css
- ์ ์ฒด ํ ํ๋ฆฟ, ๋ผ๋, ๊ตฌ์กฐ๋ฅผ ๋ด๋น
- TodoInsert.js & TodoInsert.css
- ๊ธ ์ถ๊ฐ (CREATE) ๊ธฐ๋ฅ์ฉ ์ปดํฌ๋ํธ
- pop-up(Modal)์ฐฝ์ฒ๋ผ ๋์ธ๊ผฌ์ผ
- TodoItem.js & TodoItem.css
- ํ๋ํ๋์ ๊ธ ๊ด๋ฆฌ ์ปดํฌ๋ํธ
- TodoList.js & TodoList.css
- ์ ์ฒด ๊ธ ๊ด๋ฆฌ ์ปดํฌ๋ํธ
- App.js & App.css
- ์ ์ฒด ํ๋ฉด ๋ ๋๋ง ์ปดํฌ๋ํธ
2. ๊ธฐ๋ณธ ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
- App.js
- ์ผ๋จ App.js๋ฅผ ๋ฐ์์ฒ๋ผ ์์ฑํ๋ฉด ๋น ํ๋ฉด์ "์๋ ํ์ธ์"๋ง ๋จ๊ณ ์์ด์
- Template.js
- ๋ผ๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฑธ ๋ง๋ค์ด์ค์. ์์ App.js <div>์ ๋ฃ์ด์ค๊บผ์์.
import React from "react";
import "./Template.css";
const Template = ({ children}) => {
return (
<div className='Template'>
<div className='title'>์ค๋์ ํ ์ผ (0)</div>
<div>{children}</div>
</div>
);
};
export default Template;
์ด ๋, Template์ children์ ์ ๋ฌ์ธ์๋ก ์ ํด์ค์ ์ค๋์ ํ ์ผ ๋ฐ์ ์ปดํฌ๋ํธ๋ก ๋์์ฃผ๋ฉด
App.js์์ ์ ์ฉํ ๋ <Template>์๋ ํ์ธ์</Template> OR <Template><TodoList/></Template> ์ฒ๋ผ Template์ฌ์ด์ ๋ค์ด๊ฐ๋ ๋ฌธ์์ด์ด๋ ์์ ์ปดํฌ๋ํธ ๋ฑ์ ํ๋ฉด์ ๊ทธ๋๋ก ๋์์ค๋๋ค.
- App.js
import React, { useState } from "react";
import "./App.css";
import Template from "./components/Template";
import TodoInsert from "./components/TodoInsert";
import TodoList from "./components/TodoList";
const App = () => {
//React Hook์ ์ด์ฉํด ๊ธฐ๋ณธ ํ ์ผ ๋ชฉ๋ก ์ ์
const [todos, setTodos] = useState([
{
id: 1,
text: "ํ ์ผ 1",
checked: true,
},
{
id: 2,
text: "ํ ์ผ 2",
checked: false,
},
{
id: 3,
text: "ํ ์ผ 3",
checked: true,
},
]);
return (
<Template todoLength={todos.length}>
<TodoList
todos={todos} //todos๋ฆฌ์คํธ ๋ณด๋ด์ฃผ๊ธฐ
/>
</Template>
);
};
export default App;
- Template.js
import React from "react";
import "./Template.css";
const Template = ({ children, todoLength }) => {
return (
<div className='Template'>
<div className='title'>์ค๋์ ํ ์ผ ({todoLength})</div>
<div>{children}</div>
</div>
);
};
export default Template;
- TodoList.js
- ์ด ๋, map์ ์ด์ฉํ๋ฉด ๊ณ ์ ํ id๊ฐ์ ๊ผญ key์ ๋ฃ์ด์ค์ผ warning์ด ์๋ฌ๋ค!
import React from "react";
import TodoItem from "./TodoItem";
import "./TodoList.css";
const TodoList = ({todos}) => {
return (
<div className='TodoList'>
{todos.map((todo) => ( //map์ ํตํด ํ๋ํ๋ ๋ฟ๋ ค์ฃผ๊ธฐ
<TodoItem
key={todo.id}
todo={todo}
/>
))}
</div>
);
};
export default TodoList;
- TodoItem.js
- ๊ฐ์ฒด ๋ถํด ํ ๋น์ ์ด์ฉํด์ text๋ถ๋ถ "ํ ์ผ1","ํ ์ผ2","ํ ์ผ3"์ ํ๋ฉด์ ๋์์ฃผ๊ธฐ
โโโ React Hook?
ํจ์ ์ปดํฌ๋ํธ ์์์ state๋ฅผ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ!!
'DEV_IN > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React๋ก TodoApp ๋ง๋ค๊ธฐ (3)Delete,Update ๊ธฐ๋ฅ ๊ฐ๋ฐ (2) | 2023.03.02 |
---|---|
React๋ก TodoApp ๋ง๋ค๊ธฐ (2)Create ๊ธฐ๋ฅ ๊ฐ๋ฐ (2) | 2023.03.02 |
JSX (2) | 2023.02.21 |
What is React? (3) | 2023.02.21 |
ํน์ ๋ฒํผ์ ๋๋ ์ ๋๋ง, ์ด๋ฒคํธ ์ฃผ๊ธฐ (6) | 2023.02.17 |
Comments