ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ToyProject-Todomate] ํˆฌ๋‘๋ฉ”์ดํŠธ ํด๋ก  ํ”„๋กœ์ ํŠธ 20
    WEB Dev/ToyProject 2022. 1. 2. 14:12
    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

    ๋Œ“๊ธ€

Designed by Tistory.