[ToyProject-Todomate] ํˆฌ๋‘๋ฉ”์ดํŠธ ํด๋ก  ํ”„๋กœ์ ํŠธ 20

2022. 1. 2. 14:12ใ†WEB Dev/ToyProject

728x90


๐Ÿ”ท CloneTodo โ˜‘ - Todomate Clone Project  |  Team CloneMate

 

CloneTodo : ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ๋ž‘ํ•˜๋Š” ํˆฌ๋‘๋ฉ”์ดํŠธ๋ฅผ ํด๋ก ํ•˜์—ฌ ์›น ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•ด๋ณด๋Š” ํ”„๋กœ์ ํŠธ

 


 

์ด์ œ ์ฆ๊ฑฐ์šด ๋งˆํฌ์—… ์‹œ๊ฐ„์€ ๊ฐ€๊ณ  ์ง„์งœ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•ด๋†”์•ผ ํ•˜๋Š” ์‹œ์ ์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค.

์ด์ œ Main์˜ Feed ๋ถ€๋ถ„์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด Feed๋Š” Goal(๋ชฉํ‘œ)์˜ ํ•˜์œ„์— ๋“ค์–ด๊ฐ€๋Š” todo๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋ผ Goal ํŽ˜์ด์ง€ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊นจ๋‹ฌ์•˜๋‹ค.

์ด๋Ÿฐ ์ˆœ์„œ๋„ ์—†์ด ๋งˆ๊ตฌ์žก์ด๋กœ ๋งŒ๋“œ๋ ค๊ณ  ํ•˜๋‹ˆ ์˜คํžˆ๋ ค ๋‚ด Todo๊ฐ€ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋˜๋Š” ๋Š๋‚Œ์ด๋‹ค. 

 

 

์™œ์งธ์„œ

 

 

๊ทธ๋ž˜์„œ ํšŒํ”ผ๋กœ ๊ฐ€๋“์ฐจ๋Š” ๋ฐ”๋žŒ์— ์–ด์ œ๋„ ์กฐ๊ธˆ ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ ธ์ง€๋งŒ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ์ง€ ๋ชปํ•ด์„œ ์˜ค๋Š˜ ๋ชฐ์•„์„œ ๊ธฐ๋กํ•œ๋‹ค.

 

 


 

 

์šฐ์„  ์ฃผ๋ง ๊ณ„ํš์€ Goals โ–ถ Feed ์ˆœ์œผ๋กœ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ CSS๋ฅผ ์žก๋Š” ๊ฒƒ์ด์—ˆ๋‹ค..

ํˆฌ๋‘๋ฆฌ์ŠคํŠธ์ด๋‹ˆ ๋งŒํผ ์šฐ์„  ์ด ๊ธฐ๋Šฅ๋“ค๋งŒ ๊ตฌํ˜„์ด ๋œ๋‹ค๋ฉด ๊ฑฐ์˜ ์™„์„ฑ์ด ๋œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ์‹ถ์€๋ฐ (์•„๋‹™๋‹ˆ๋‹ค)

์ด๊ฑธ ๋‚˜์ค‘์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์—ฌ๋Ÿฌ๋ชจ๋กœ ๋‚ด๊ฐ€ ๋ณ„๋„๋กœ ์ƒ๊ฐํ•˜๊ณ  ๊ณ ๋ฏผํ•  ๊ฒƒ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„์„œ

๊ฑฐ์˜ 90% ์ด์ƒ ๊น€๋‹ค์ •๋‹˜์˜ ์ฑ…์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ๊น€๋‹ค์ •๋‹˜ ์ฑ…์ด ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๋˜์–ด ์žˆ์–ด์„œ return ์ดํ›„์˜ JSX๋Š” ์ฆ‰์‹œ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•œ๋ฐ props-state ์“ฐ๋Š” ๋ฐฉ์‹์ด ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค๋Š” ์ ์ด์žˆ๋‹ค.

 

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

 

 

1. Goals.js ๋งŒ๋“ค๊ธฐ

 

'๋ชฉํ‘œ' ๋ฅผ ๋งŒ๋“œ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด Goals ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

import React from 'react';
import Box from '@mui/material/Box';


export default function Goals() {

    return (
        <Box className='goals-wrap' backgroundColor='#f66a5550' sx={{ position: 'relative' }}>
                <input type='checkbox' id='todo0' name='todo0' checked='todo0' />
                <label for='todo0'>'๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ'</label>   
        </Box>
    );
}

 

 

์›๋ž˜ ํˆฌ๋‘๋ฉ”์ดํŠธ์˜ goal์€ ์ด๋Ÿฐ ํŽ˜์ด์ง€๋‹ค.

 

 

2. App.js์— State ๋งŒ๋“ค๊ธฐ

 

์ƒํƒœ๊ด€๋ฆฌ Recoil์„ ์“ฐ๊ธฐ ์ „, ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋”๋ฏธstate๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

App.js์— useState๋ฅผ import ํ•ด์ค€๋‹ค.

 

 

import React, { useState } from "react";

 

 

๊ทธ๋ฆฌ๊ณ  ๋ Œ๋”๋ง๋˜๋Š” App ํ•จ์ˆ˜ ๋‚ด๋ถ€ ์ƒ๋‹จ์—

 

 let [goal, goalChange] = useState({
        id : 0,
        title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ',
        done: true
})

 

์œผ๋กœ useState๋ฅผ ์‚ฌ์šฉํ•ด State๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , Route๋ฅผ ์ด์šฉํ•ด url์„ ํ†ตํ•ด Goals ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

<Route exact path="/goals">
  <BasicNavBar/>
  <Goals />
</Route>

 

 

3. useState์˜ state props๋กœ ์ „๋‹ฌํ•˜๊ธฐ

 

Goals ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋†“๊ณ  App.js์—๋‹ค๊ฐ€ useState๋ฅผ ์ด์šฉํ•ด ์ƒํƒœ๋ฅผ ๋งŒ๋“  ์ด์œ ๋Š” ๋ฆฌ์•กํŠธ์—์„œ ๋ชจ๋“  ์ƒํƒœ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‚˜์ค‘์— ์ด ์ƒํƒœ๋“ค์€ Recoil์ด๋ผ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ์ •๋ฆฌ๊ฐ€ ๋ ๊ฑฐ์ง€๋งŒ, state๋Š” props๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅด๋Š” ์„ฑ๊ฒฉ ๋•Œ๋ฌธ์— ๋‚ด ์ž‘์—…๋ฌผ์˜ ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ์ธ App.js์— ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก  ๋‹น์—ฐํžˆ Goals ์ปดํฌ๋„ŒํŠธ์— state๋ฅผ ๋งŒ๋“ค์–ด๋„ ๋˜์ง€๋งŒ state๋Š” ์•„๋ž˜์—์„œ ์œ„๋กœ๋Š” ๊บผ๋‚ด ์“ธ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ํ˜น์‹œ ๋ชจ๋ฅด๊ฒŒ ๊ฐ‘์ž๊ธฐ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด state๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด Goals์˜ ํ•˜์œ„์— ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์ง€ ์•Š๋Š” ์ด์ƒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์—†๋‹ค. 

๊ทธ๋ž˜์„œ ์•ˆ์ „ํ•˜๊ฒŒ App๊ณผ ๊ฐ™์€ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

 

 

โ‡จ ๋ฆฌ์•กํŠธ์—์„œ์˜ ์ƒํƒœ (State)

 

  1. ์ตœ์ƒ์œ„์—์„œ ์•„๋ž˜๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  2. ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ชป ์˜ฌ๋ ค๋ณด๋‚ธ๋‹ค.
  3. ์ƒ์œ„์—์„œ ํ•˜์œ„๋กœ ์ „๋‹ฌ๋  ๋•Œ๋Š” State๋ผ๋Š” ์ด๋ฆ„์ด ์•„๋‹Œ Props๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ๋‚ด๋ ค๊ฐ„๋‹ค.

 

 

Route๋กœ ๊ฐ์‹ผ goals์ปดํฌ๋„ŒํŠธ์— props๋กœ state๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

<Route exact path="/goals">
  <BasicNavBar/>
  <Goals id={goal.id} title={goal.title} done={goal.done} />
</Route>

 

 

props์˜ ํ˜•ํƒœ๋Š” ๋งˆ์น˜ HTML์˜ Attribute(์†์„ฑ)๊ณผ ๊ฐ™๋‹ค.

์ด๋ฆ„ = ๊ฐ’ ์˜ ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๋Š”๋ฐ, ์œ„์—์„œ State์˜ ์ด๋ฆ„์„ goal๋กœ ์ง€์—ˆ๊ณ , ๊ฐ์ฒด ํ˜•ํƒœ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด์˜ ๊ฐœ๋ณ„ ๊ฐ’์„ ๋ถ€๋ฅด๋Š” ๋ฐฉ์‹์ธ .(์˜จ์ ) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋”ฐ๋ผ์„œ goal.id ํ•˜๋ฉด id state๋ฅผ props ํ˜•ํƒœ๋กœ ๋ณด๋‚ด๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์— ์ ์€ id=, title=, done=, ์€ ์ด์ œ Goals ์ปดํฌ๋„ŒํŠธ์—์„œ props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„๋“ค์ด ๋œ๋‹ค.

 

 

Goals ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด props๋กœ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์„œ ํ™”๋ฉด์— ๋ฟŒ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

 

import React from 'react';
import Box from '@mui/material/Box';

export default function Goals(props) {

    return (
      <Box className='goals-wrap' backgroundColor='#f66a5550' sx={{ position: 'relative' }}>
        <input type='checkbox' id={props.id} name={props.id} checked={props.done} />
        <label for={props.id}>{ props.title }</label>   
      </Box>
    );
}

 

 

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ƒ๋‹จ ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€์— ์ธ์ž๋กœ props๋ฅผ ๋ฐ›์•„์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ €๊ฒŒ ์•ˆ ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉด ์ƒ์œ„์—์„œ ์•„๋ฌด๋ฆฌ props๋ฅผ ๋ณด๋‚ด๋„ ์ธ์ž๋กœ ๋ฐ›์ง€ ์•Š์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ƒฅ ํ•จ์ˆ˜ ๊ฐœ๋…์ด๋ž‘ ๋˜‘๊ฐ™๋‹ค. ๊ฐ’์„ ์•„๋ฌด๋ฆฌ ๋ณด๋‚ด๋„ ์ธ์ž๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๋Š” ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Goals ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋Š” JSX์˜ ์•ˆ์— input ๋“ค์˜ ์†์„ฑ์— props.id ์‹์œผ๋กœ props์— ์žˆ๋Š” id ๊ฐ’์„ ๊บผ๋‚ด์˜ค๊ฒ ๋‹ค ํ•˜๊ณ  ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  JSX์˜ ๋ณ€์ˆ˜๋Š” { } ์ค‘๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

 

props๊ฐ€ ๋ˆˆ์— ์•ˆ๋ณด์—ฌ์„œ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ๋Š˜ ๊ทธ๋ ‡๋“ฏ์ด console.log(props) ํ•ด์ฃผ๋ฉด ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค.

 

 

 

4. state๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด?

 

๋‹น์—ฐํžˆ ํ•˜๋ฃจ์— ํ•œ ๊ฐœ์˜ Todo๋งŒ ๊ณ„ํšํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ todo๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๊นŒ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋˜ state๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฟŒ๋ ค์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

์•„๊นŒ ๋งŒ๋“  goal์ด๋ผ๋Š” state๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๋‹ค.

 

 let [goal, goalChange] = useState({
        id : 0,
        title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ',
        done: true
})

 

 

์ด { id:0, title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ', done: true } ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ์„๊นŒ?

์ด ๋•Œ๋Š” ๊ทธ๋ƒฅ ๊ฐ์ฒด์˜ ๋‚˜์—ด์ด ์•„๋‹Œ ๋ฐฐ์—ด [ ] ์•ˆ์— ๊ฐ์ฒด๋ฅผ ๋‚˜์—ดํ•ด์ค˜์•ผํ•œ๋‹ค.

 

๋ง๋กœ ํ•˜๋ฉด ์–ด๋ ต๊ณ  ๋ณด๋ฉด ์•ˆ๋‹คใ… ใ…  ์ด ๋ถ€๋ถ„์—์„œ ๋‚˜๋„ ์—„์ฒญ ํ—ค๋ฉจ๋‹ค.

 

useState( [  {๊ฐ์ฒด0}, {๊ฐ์ฒด1}, {๊ฐ์ฒด2}  ] ) ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์„œ, ์ธ๋ฑ์Šค๋กœ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋œ๋‹ค.

 

// ๋ชฉํ‘œgoals ํŽ˜์ด์ง€ goal ์•„์ดํ…œ
  let [goal, goalChange] = useState(
    [
          { 
            id : 0,
            title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ',
            done: true
          },
          {
            id: 1,
            title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ 2',
            done: false
          },
          {
            id: 2,
            title: '๋ชฉํ‘œ ๋งŒ๋“ค๊ธฐ 3',
            done: false
          },
    
    ]
  )

 

 

์ด์ œ goal state๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋˜์—ˆ์œผ๋‹ˆ ๋ณด๋‚ด๋Š” props๋„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ฐ”๊พธ๊ณ , Goals ์ปดํฌ๋„ŒํŠธ์˜ input ๋ถ€๋ถ„๋„ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ๋ชจ๋“  props๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์ž.

 

 

// App.js 

<Route exact path="/goals">
  <BasicNavBar/>
  <Goals goal={goal} />
</Route>

 

// Goals.js

import React from 'react';
import Box from '@mui/material/Box';

export default function Goals(props) {
    let goalItems = props.goal;
    return (
        <Box className='goals-wrap' backgroundColor='#f66a5550' sx={{ position: 'relative' }}>
            {goalItems.map((item, idx)=>{
               return  ( 
                <>
                <input type='checkbox' id={item.id} name={item.id} checked={item.done} />
                <label for={item.id}>{ item.title }</label>   
                </>
                )
            })}
        </Box>
    );
}

 

 

props๋ฅผ ๋ฏธ๋ฆฌ goalItems๋ผ๋Š” ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด goalItems๋Š” ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— map() ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

goalItems๋ฅผ map์œผ๋กœ ๋Œ๋ ค item์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ›์•„์ฃผ๊ณ , map ํ•จ์ˆ˜๊ฐ€ return ํ•˜๋Š” ๊ฐ’์„ JSX input ํƒœ๊ทธ๋“ค๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. item ์œผ๋กœ ๋‚ด์šฉ์„ ๋ฐ›์•„์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— item.id, item.done, item.title์ด ๊ฐ attribute์˜ ๊ฐ’์ด ๋œ๋‹ค. 

 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

5. MUI๋กœ UI ๋งŒ๋“ค๊ธฐ

 

 

์ด์ œ ํ•„์š”ํ•œ๊ฑด UI๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ผ์ธ๋ฐ, ์ฑ…์—์„œ ๋‚˜์˜จ ๊ฒƒ ์ฒ˜๋Ÿผ MUI์˜ ListItem๊ณผ CheckBox, InputBase ๋“ฑ์„ ์ด์šฉํ•œ๋‹ค.

 

 

import React from "react";
import { Checkbox, InputBase, ListItem, ListItemText } from "@mui/material";

export default function Goals(props) {
  console.log(props.goal);
  let goalItems = props.goal;
  return (
    <>
      {goalItems.map((item, idx) => {
        return (
          <ListItem className="goals-wrap">
            <Checkbox checked={item.done} />
            <ListItemText>
              <InputBase
                inputProps={{ "aria-label": "naked" }}
                type="text"
                id={item.id}
                name={item.id}
                value={item.title}
                multiline={true}
                fullWidth={true}
              />
            </ListItemText>
          </ListItem>
        );
      })}
    </>
  );
}

 

 

 

 

 

 

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด ๋‹ค์Œ์—๋Š” ๋ชฉํ‘œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค..!

 

 

728x90