[React] ํฌ๋๋ฆฌ์คํธ ์ปดํฌ๋ํธ ๊ตฌ์กฐ&์ฝ๋ ๋ถ์
๐๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ ํตํด ๊ณต๋ถํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ํฌ์คํธ์ ๋๋ค.๐
์ค๋์ ๊ทธ๋์ ๋ฐฐ์ ๋ ์ปดํฌ๋ํธ๋ค์ ์ค์ฌ์ผ๋ก ํ ์ผ์ ์์ฑํ๊ณ ๊ธฐ๋กํ๋ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
์ฒ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ ์์ฑ๋ ํ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ณด๋ ๊ฑฐ๋ผ ์์ ๋ฅผ ๋ฐ๋ผํ๋ฉด์๋ ์ปดํฌ๋ํธ๊ฐ์ ๊ตฌ์กฐ์ ์ธ์ธํ๊ฒ ์ฐ์ด๋ ์์ฑ๋ค์ ๊ดํด ๋ ์์ธํ๊ฒ ์๊ณ ์ถ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ์์ด ๊ถ๊ธํ ๋ถ๋ถ๋ค์ด ๋ง์ด ์์ด์ ์ ๋ฆฌํด๋ณด์๋ค.
์ผ๋จ ์ ๋ฆฌํ ๋ถ๋ถ์
-
ํฌ๋๋ฆฌ์คํธ์ ์ปดํฌ๋ํธ ๊ตฌ์กฐ
-
import cn from {classnames};
๋ฆฌ์กํธ๋ก ๋ง๋ ํฌ๋๋ฆฌ์คํธ ์ฝ๋
์๋๋ ์ฝ๋๋ฅผ ๋ค ๋ฐ๋ก ์ฌ๋ฆฌ๋ ค๊ณ ํ์ง๋ง, ๋ง๋ ํ์ผ๋ ๋ง๊ณ ํ๋ค๋ณด๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ๊ฒ ๊ฐ๋ค๋ ํ๋จํ์ ๊นํ์ ์ฌ๋ฆฌ๋ ๊ฒ ๋ ๋์ ๊ฒ ๊ฐ๋ค.
github.com/MinJoo-Park01/React-Study/tree/master/todo-app/src
ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋์ ํ์ผ์ด๋ ์ฐธ๊ณ ํ๋ฉด์ ๋ณด์ค ๋ถ๋ค์ ๋ค์ด๊ฐ์ ํ์ธํด๋ณด์๋ ๊ฒ๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค =)
์ด๋ ๋ฒจ๋กํผํธ๋์ ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์ด๋ผ๋ ์ฑ ์์ ๋์์๋ ์์ ์ธ๋ฐ ์ด๋ฅผ ๋ฐํ์ผ๋ก ๋ด ๋๋ฆ๋๋ก ์๋ก์ด ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค ์์ ์ด๋ค.
ํฌ๋๋ฆฌ์คํธ์ ์ปดํฌ๋ํธ ๊ตฌ์กฐ
๋ฆฌ์กํธ๋ฅผ ์ง๊ธ๊น์ง ๊ณต๋ถํ ๋ด์ฉ๋ค์ ๋ฐํ์ผ๋ก ๊ฐ๋จํ ์์ ์ธ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
state์ ์ํด ์์ง์ด๊ณ ์ด ํฌ๋๋ฆฌ์คํธ์์๋ ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ์ญํ ์ ํ๊ณ , ์ด๋ค ํจ์๋ค์ ๊ฐ์ง๋์ง ๋, ์ด๋ค ๊ฐ๋ค์ props๋ก ๊ฐ์ ธ์ ๋์์ด ๋๊ณ ์๋์ง ํ ๋์ ๋ณด๊ธฐ ์ํด์ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ด ํฌ๋๋ฆฌ์คํธ์ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ ค๋ณด์๋ค.
์ด ์์ ๋ App ์์ todos ์ํ์, onToggle, onRemove, onCreate ํจ์๋ฅผ ์ง๋๊ณ ์๊ฒ ํ๊ณ , ํด๋น ๊ฐ๋ค์ props ๋ฅผ ์ฌ์ฉํด์ ์์ ์ปดํฌ๋ํธ๋ค์๊ฒ ์ ๋ฌํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๊ณ ์๋ค.
์ด ํ๋ก์ ํธ๋ ์์ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ํ๋ํ๋ ๊ตฌํํด๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง, ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ฒ ๋๋ค๋ฉด App์์ ๋ชจ๋ ์ํ๊ด๋ฆฌ๋ฅผ ํ๊ธฐ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ธฐ๋ ํ๋ฉฐ, props๋ฅผ ์ ๋ฌํด์ค์ผ ํ๋ ์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ๊น์ด ์์ด ์ค๋์๊ฐ์ด ๊ฑธ๋ฆด ์๋ ์๋ค.
โ๐ป์ด๋ฐ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ Context API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค.
Context API๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ ๋ฆฌํด์ ์ฌ๋ ค์ผ๊ฒ ๋ค!!
๐คimport cn from {classnames}; ์ด ๋ญ์ง?
์ด๋ฒ ํฌ๋๋ฆฌ์คํธ ์์ ๋ฅผ ์์ฑํ๋ค๊ฐ import cn from {classnames}; ๋ผ๋ ์ฝ๋๊ฐ ์ฌ์ฉ๋๋ ๊ฑธ ๋ฐ๊ฒฌํ์๋ค.
์ด๊ฒ ๋ญ๊ฐ ์ถ๊ธฐ๋ ํ๊ณ , ์์ ๊ฐ ํ๋ผ๋ ๋๋ก ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํ์ํค๋ฉด ์ค๋ฅ๊ฐ ๋จ๋ ๊ฑธ ๋ฐ๊ฒฌํ ์ ์์๋ค.
ํฌ๋๋ฆฌ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ณด๋ฉด, mapํจ์์์ ์ฐ์ด๋ key ๊ฐ์ ๊ฐ ํญ๋ชฉ๋ง๋ค ๊ฐ์ง๊ณ ์๋ ๊ณ ์ณ๊ฐ์ธ id๋ฅผ ๋ฃ์ด์ฃผ์ด์ผํ๋ค.
๋, todo๋ฐ์ดํฐ๋ ํต์งธ๋ก props๋ก ์ ๋ฌํด์ผํ๋ค.
=> ์ด๋ ๊ฒ ์ฌ๋ฌ ์ข ๋ฅ์ ๊ฐ์ ์ ๋ฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ classnames๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ก ํต์งธ๋ก ์ ๋ฌํ๋ ํธ์ด ๋์ค์ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ๋ ํธ๋ฆฌํ๋ค.
ํ์ง๋ง, ์ด๋ ๊ฒ ์ฝ๊ณ ๋๋ ์ดํด๊ฐ ๋๋๋ฏ~ ์๋๋๋ฏ~ํด์ ๊ฒ์์ ํ๋ค ์๋ ๊นํ์ ๋ณด๊ฒ ๋์๋ค.
์ด ๊นํ์ ์ฝ๊ณ ๋๋, classnames์ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, ์์์ ๊ฐ์ฒด๋ฅผ ํต์งธ๋ก ์ ๋ฌํ๋ ๊ฒ์ฒ๋ผ ์กฐ๊ฑด๋ถ๋ก classNames๋ฅผ ๊ฒฐํฉํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ํธ๋ฆฌํฐ๋ผ๊ณ ํ๋ค.
๊ทธ๋ฅ import cn from {classnames}; ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด, ์คํ์์ผฐ์ ๋ ์์์ ๋งํ ๊ฒ์ฒ๋ผ ๋น์ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
//classname ์ฌ์ฉ๋ฐฉ๋ฒ
//npm
npm install classnames
//yarn
yarn add classnames
ํฐ๋ฏธ๋์์ ์์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ์ผ์ง classnames ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋๋ ์ด๋ฅผ ํ ๋๋ก ํฌ๋๋ฆฌ์คํธ์ ์์ฑ๋ classnames๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ํ ๋ฒ ๋ฏ์ด๋ณด๊ฒ ๋ค!
๐๐ปTodoListItem.js
import React from 'react';
import { MdCheckBoxOutlineBlank, MdCheckBox, MdRemoveCircleOutline } from 'react-icons/md';
import './TodoListItem.css';
import cn from 'classnames'; //classnames์ฌ์ฉ ๋ช
์
import './TodoListItem.css';
const TodoListItem = ({ todo, onRemove, onToggle }) => {
const { id, text, checked } = todo;
return (
<div className="TodoListItem">
<div className={cn('checkbox', { checked })} onClick={() => onToggle(id)}>
{/* ์ ๋ถ๋ถ์์ classnames ์ฌ์ฉ */}
{checked ? <MdCheckBox /> : <MdCheckBoxOutlineBlank />}
<div className="text">{text}</div>
</div>
<div className="remove" onClick={() => onRemove(id)}>
<MdRemoveCircleOutline />
</div>
</div>
)
}
export default React.memo(TodoListItem);
์์ ์ฌ๋ ค๋์ ์ฝ๋์์ <div className={cn('checkbox', { checked })} onClick={() => onToggle(id)}> ์ด ๋ถ๋ถ์ด cn์ผ๋ก classnames๊ฐ ์ฌ์ฉ๋์๋ค.
className์ true์ ํด๋นํ๋ ๊ฐ์ ์ถ๊ฐ๋ก ํ์๊ฐ ๊ฐ๋ฅํ๊ณ , false๊ฐ ๋๋ค๋ฉด className์ ์ ์ฉ๋์ง ์๋๋ค.
์ด ์ฝ๋๋ checkbox ๋ฅผ checked์์ ๋์จ true ํน์ false์ ๊ฐ์ ๊ฐ๋๋ก ํ๋๋ก ๋ฌถ์ด์ค ํ, ํ๋์ ๋ฌถ์์ผ๋ก ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ์ด ๋ถ๋ถ์ด ์ฒดํฌํ์๊ฐ ๋๋ค๋ฉด checkbox checked๋ผ๊ณ ํ์๊ฐ ๊ฐ๋ฅํ ๊ฒ์ด๊ณ , checked๊ฐ false๋ผ๋ฉด checked๊ฐ ์ ์ฉ์ด ๋์ง ์์์ checkbox๋ง className์ ์ ์ฉ๋ ๊ฒ์ด๋ค.