-
컴포넌트 분리FrontEnd/React 2023. 11. 16. 05:00반응형
이번 포스팅에서는 ToDo App의 컴포넌트를 분리합니다. 컴포넌트를 분리할 때는 최대한 재사용이 가능하도록 합니다. ToDo App에서는 할 일 목록을 보여주는 List 컴포넌트와 할 일을 입력하는 Form 컴포넌트를 분리합니다.
List Component
- components 폴더를 생성하고 Lists.js 파일을 생성합니다.
- 리스트에 관련된 UI 부분을 가져옵니다.
- 필요한 state, 함수 등을 가져옵니다.
- Lists 컴포넌트에 props를 내려줍니다.
- props로 필요한 데이터, 함수를 가져옵니다.
Lists.js
import React from 'react' export default function Lists({ todoData, setTodoData }) { const btnStyle = { color: "#fff", border: "none", padding: "5px 9px", borderRadius: "50%", cursor: "pointer", float: "right" }; const getStyle = (completed) => { return { padding: "10px", borderBottom: "1px #ccc dotted", textDecoration: completed ? 'line-through' : "none", } }; const handleClick = (id) => { let newTodoData = todoData.filter((data) => data.id !== id); setTodoData(newTodoData); }; const handleCompleChange = (id) => { let newTodoData = todoData.map((data) => { if (data.id === id) { data.completed = !data.completed; } return data; }); setTodoData(newTodoData); }; return ( <div> {todoData.map((data) => ( <div style={getStyle(data.completed)} key={data.id}> <input type="checkbox" onChange={() => handleCompleChange(data.id)} defaultChecked={false} /> {data.title} <button style={btnStyle} onClick={() => handleClick(data.id)}>x</button> </div> ))} </div> ) }
Note. props vs state
- props(properties): 부모 컴포넌트로부터 자녀 컴포넌트에 데이터 등을 전달하는 방법입니다. props는 읽기 전용(immutable)으로 부모 컴포넌트에서 state를 변경시켜줘야 합니다.
- state: 해당 컴포넌트 내부에서 데이터를 전달하는 방법입니다. 변경 가능(mutable) 하며, state가 변하면 re-render 됩니다.
Form Component
- components 폴더 하위 Form.js 파일을 생성합니다.
- UI 부분을 가져옵니다.
- 필요한 함수를 가져옵니다.
- Form 컴포넌트에 props를 내려줍니다.
- props로 필요한 데이터, 함수를 가져옵니다.
Form.js
import React from 'react' export default function Form({ handleSubmit, value, setValue }) { const handleChange = (e) => { setValue(e.target.value); }; return ( <form style={{ display: 'flex' }} onSubmit={handleSubmit}> <input type="text" name="value" style={{ flex: 10, padding: '5px' }} placeholder="해야 할 일을 입력하세요." value={value} onChange={handleChange} /> <input type="submit" value="입력" className="btn" style={{ flex: 1 }} /> </form> ) }
App.js
import React, { useState } from "react"; import "./App.css"; import Lists from "./components/Lists"; import Form from "./components/Form"; export default function App() { const [todoData, setTodoData] = useState([]); const [value, setValue] = useState(""); const handleSubmit = (e) => { ... 생략 ... }; return ( <div className="container"> <div className="todoBlock"> <div class="title"> <h1>할 일 목록</h1> </div> {/* List Component */} <Lists todoData={todoData} setTodoData={setTodoData} /> {/* Form Component */} <Form handleSubmit={handleSubmit} value={value} setValue={setValue} /> </div> </div> ); }
[참고 정보]
반응형'FrontEnd > React' 카테고리의 다른 글
react-beautiful-dnd (0) 2023.11.22 TailwindCSS (0) 2023.11.16 React Hooks (0) 2023.11.11 React ToDo App (0) 2023.11.10 React 개발 환경 설정 (1) 2023.11.01