WEB/REACT

[React] ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ&์ฝ”๋“œ ๋ถ„์„

mingzoo 2021. 1. 11. 22:59

 

๐Ÿ“–๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์„ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ•œ ํฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.๐Ÿ“–

์˜ค๋Š˜์€ ๊ทธ๋™์•ˆ ๋ฐฐ์› ๋˜ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ค‘์‹ฌ์œผ๋กœ ํ•  ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ๊ธฐ๋กํ•˜๋Š” ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

์ฒ˜์Œ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์™„์„ฑ๋œ ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฑฐ๋ผ ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผํ•˜๋ฉด์„œ๋„ ์ปดํฌ๋„ŒํŠธ๊ฐ„์˜ ๊ตฌ์กฐ์™€ ์„ธ์„ธํ•˜๊ฒŒ ์“ฐ์ด๋Š” ์†์„ฑ๋“ค์— ๊ด€ํ•ด ๋” ์ž์„ธํ•˜๊ฒŒ ์•Œ๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žˆ์–ด ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์ด ์žˆ์–ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

 


 

์ผ๋‹จ ์ •๋ฆฌํ•œ ๋ถ€๋ถ„์€ 

  • ํˆฌ๋‘๋ฆฌ์ŠคํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

  • import cn from {classnames};


 

๋ฆฌ์•กํŠธ๋กœ ๋งŒ๋“  ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ

์›๋ž˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค ๋”ฐ๋กœ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋งŒ๋“  ํŒŒ์ผ๋„ ๋งŽ๊ณ  ํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํŒ๋‹จํ•˜์— ๊นƒํ—™์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ๋” ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

github.com/MinJoo-Park01/React-Study/tree/master/todo-app/src

 

MinJoo-Park01/React-Study

HUFS TAB React Study. Contribute to MinJoo-Park01/React-Study development by creating an account on GitHub.

github.com

ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋†“์€ ํŒŒ์ผ์ด๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ๋ณด์‹ค ๋ถ„๋“ค์€ ๋“ค์–ด๊ฐ€์„œ ํ™•์ธํ•ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค =)

์ด๋Š” ๋ฒจ๋กœํผํŠธ๋‹˜์˜ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  ์ด๋ผ๋Š” ์ฑ…์—์„œ ๋‚˜์™€์žˆ๋Š” ์˜ˆ์ œ์ธ๋ฐ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ์ƒˆ๋กœ์šด ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์˜ˆ์ •์ด๋‹ค.

 

ํˆฌ๋‘๋ฆฌ์ŠคํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

๋ฆฌ์•กํŠธ๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ธ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

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๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋กœ ํ†ต์งธ๋กœ ์ „๋‹ฌํ•˜๋Š” ํŽธ์ด ๋‚˜์ค‘์— ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ด๋ ‡๊ฒŒ ์ฝ๊ณ ๋‚˜๋‹ˆ ์ดํ•ด๊ฐ€ ๋˜๋Š”๋“ฏ~ ์•ˆ๋˜๋Š”๋“ฏ~ํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ•˜๋‹ค ์•„๋ž˜ ๊นƒํ—™์„ ๋ณด๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

JedWatson/classnames

A simple javascript utility for conditionally joining classNames together - JedWatson/classnames

github.com

์ด ๊นƒํ—™์„ ์ฝ๊ณ ๋‚˜๋‹ˆ, 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์— ์ ์šฉ๋  ๊ฒƒ์ด๋‹ค.

 

 

728x90