๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“‚ Project/Solo

[๐Ÿ” ๋ง›์ง‘ ๊ณต์œ  ์‚ฌ์ดํŠธ] ๋ชจ๋‹ฌ์ฐฝ ๊ฐ™์€ ๋™์ ์ธ UI ๋งŒ๋“ค๊ธฐ

by Dev. Ella 2023. 5. 11.

๐Ÿ› ๏ธ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ

์„ฑ์ˆ˜์—ญ, ๊ฐ•๋‚จ์—ญ, ์••๊ตฌ์ •์—ญ ์ด ์„ธ ๊ฐœ์˜ ์ œ๋ชฉ์ด ์žˆ๊ณ  ํ˜„์žฌ ๋„์›Œ์ง€๋Š” ๋ชจ๋‹ฌ์ฐฝ์—๋Š” ์ œ๋ชฉ์ด ์••๊ตฌ์ •์—ญ์œผ๋กœ๋งŒ ๋ณด์ด๋Š”๋ฐ, ๊ฐ ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ์— ๋งž๋Š” ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์šฐ๊ณ  ์‹ถ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ฑ์ˆ˜์—ญ ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ์„ฑ์ˆ˜์—ญ ๋ง›์ง‘์„ ์†Œ๊ฐœํ•˜๋Š” ๋ชจ๋‹ฌ์ฐฝ์ด ๋„์›Œ์ง€๋„๋ก ๋ง์ด๋‹ค.

As-Is: 3๊ฐœ์˜ ์ œ๋ชฉ์ด ์žˆ์œผ๋‚˜ ํ˜„์žฌ๋Š” ๋ชจ๋‹ฌ์ฐฝ์— 1๊ฐœ์˜ ์ œ๋ชฉ์œผ๋กœ๋งŒ ๋œธ
โžก๏ธ To-be: ๊ฐ ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์ œ๋ชฉ์„ ๊ฐ€์ง„ ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์šฐ๊ณ  ์‹ถ์Œ 

 

 

๐Ÿง ์ฒ˜์Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

์ฒ˜์Œ์—๋Š” ์ œ๋ชฉ๋‹น 1๊ฐœ์”ฉ ์ด 3๊ฐœ์˜ state๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•˜๋‚˜, ์•„๋‹ˆ๋ฉด ํƒ€์ดํ‹€ ์ธ๋ฑ์Šค์— ๋งž๊ฒŒ props๋ฅผ ๋‚ด๋ ค์ฃผ์–ด์•ผ ํ•˜๋‚˜ ์ƒ๊ฐํ–ˆ๋‹ค. ์ผ๋‹จ์€ modalTitle์ด๋ผ๋Š” state๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๊ณ , ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์•ˆ์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

import './App.css';
import logo from './logo.svg';
import { useState } from 'react';

function App() {
  let post = '๐Ÿค™ ๋‚˜๋งŒ ์•„๋Š” ๋ง›์ง‘ ์ œ๋ณดํ•˜๊ธฐ'; 
  let [title, setTitle] = useState(['์„ฑ์ˆ˜์—ญ', '๊ฐ•๋‚จ์—ญ', '์••๊ตฌ์ •์—ญ']);
  let [thumb, setThumb] = useState([0,0,0]);
  let [modal, setModal] = useState(false); 
  let [modalTitle] = useState(0); // ์ผ๋‹จ state๋ฅผ ๋งŒ๋“ค์–ด์คŒ
{
    title.map(function(a, i){ 
      return (
      <div className="list" key={i}> 
      <h4 button onClick={() => { setModal(!modal) }}>{ title[i] })</h4>
      </div>)
      })
}
// ... ์ƒ๋žต

      {modal === true ? <Modal 
      title={title} 
      setTitle={setTitle}
      modalTitle={modalTitle} // ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ์•ˆ์— state๋ฅผ ๋„ฃ์–ด์คŒ
      /> : ''}
      
      <h4>{ post }</h4> 
    </div>
  );
}
function Modal(props) {
  return(
    <div className='modal'>
      <h4>{props.title[modalTitle]}</h4> // state๋ฅผ ์ž‘์„ฑํ•ด์คŒ
    </div>
  )
}

export default App;

 

 

๐Ÿ’ก ํ•ด๊ฒฐ ๊ณผ์ •

๋™์ ์ธ UI ๊ตฌํ˜„ํ•˜๊ธฐ 3steps
1. html css๋กœ ๋ฏธ๋ฆฌ ๋””์ž์ธํ•œ๋‹ค.
2. ํ˜„์žฌ UI์˜ ์ƒํƒœ๋ฅผ state๋กœ ๋งŒ๋“ค์–ด ๋‘”๋‹ค.
3. state ์ข…๋ฅ˜์— ๋”ฐ๋ผ UI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ž‘์„ฑํ•œ๋‹ค.

 

1. html css๋กœ ๋ฏธ๋ฆฌ ๋””์ž์ธํ•œ๋‹ค.

๋งŒ๋“ค์–ด์ ธ ์žˆ์Œ. ํŒจ์Šค.

 

2. ํ˜„์žฌ UI์˜ ์ƒํƒœ๋ฅผ state๋กœ ๋งŒ๋“ค์–ด ๋‘”๋‹ค.

์„ฑ์ˆ˜, ๊ฐ•๋‚จ, ์••๊ตฌ์ • ์„ธ ๊ฐ€์ง€ ์ƒํƒœ๋ฅผ state์— ์ €์žฅํ•ด ๋‘๊ธฐ. ์™„๋ฃŒํ–ˆ์œผ๋‹ˆ ํŒจ์Šค.

// state ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€
// ์ž๋ฃŒ ํ˜•์‹์€ number๋กœ ํ‘œํ˜„ํ•˜๊ฒ ์Œ (ex. 0์ด๋ฉด 0๋ฒˆ์งธ ์ œ๋ชฉ์ด ๋ณด์ด๊ฒŒ๋”)
// ๋ฌผ๋ก  string๋„ ๊ฐ€๋Šฅ

let [modalTitle] = useState(0);


3. state ์ข…๋ฅ˜์— ๋”ฐ๋ผ UI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ž‘์„ฑํ•œ๋‹ค.

ModalTitle์˜ ์ธ๋ฑ์Šค๊ฐ€ i๋ฒˆ์งธ๋ผ๋ฉด i๋ฒˆ์งธ ์ œ๋ชฉ์ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ๋ฌผ๋ก  ๊ฐ ์ œ๋ชฉ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ œ๋ชฉ์ด ๋‚˜์˜ค๋„๋ก 3๊ฐœ์˜ ์กฐ๊ฑด๋ฌธ์„ ์จ๋„ ๋˜์ง€๋งŒ, ๊ทธ๋Ÿผ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋žตํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด ๋ณด์ž.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ œ๋ชฉ ๋ถ€๋ถ„์— modalTitle์ด๋ผ๋Š” state๋ฅผ ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ธ๊ฐ€?

์•„๋‹ˆ๋‹ค.

 

 ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ ์€ 'modalTitle'์ด๋ผ๋Š” state๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ function App์— ์„ ์–ธ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ 'not defined' ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค.

function Modal(props) {
  return(
    <div className='modal'>
      <h4>{props.title[modalTitle]}</h4>

.. // 'modalTitle' is not defined

 

๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ function Modal ์•ˆ์— state๋ฅผ props๋กœ ์ „์†กํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

function Modal(props) {
  return(
    <div className='modal'>
      <h4>{ props.title[props.modalTitle] }</h4>

 

๋‹ค๋งŒ modalTitle์ด๋ผ๋Š” state๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ function App ์•ˆ์— ์žˆ์œผ๋ฏ€๋กœ ๋”ฑํžˆ props๋กœ ๋‚ด๋ ค ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋Œ€๋กœ state๋ฅผ ์ ์–ด์ค€๋‹ค.

{modal === true ? <Modal 
title={title} 
setTitle={setTitle}
modalTitle={modalTitle}
/> : ''}

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ๋ณธ๋ž˜ ๋ชฉ์ ์ธ 'ModalTitle์˜ ์ธ๋ฑ์Šค๊ฐ€ i๋ฒˆ์งธ๋ผ๋ฉด i๋ฒˆ์งธ ์ œ๋ชฉ์ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.'๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด state ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋„ ์ถ”๊ฐ€ํ•œ๋‹ค.

let [modalTitle, setModalTitle] = useState(0);

 

๊ทธ๋ฆฌ๊ณ  i ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•ด ๋ชจ๋‹ฌ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ œ๋ชฉ์ด ๋‚˜์˜ค๋„๋ก ๋งŒ๋“ ๋‹ค. map์ด๋ผ๋Š” ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ์ด i๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ๋Œ ๋•Œ๋งˆ๋‹ค 0์ด ๋˜๊ณ  1์ด ๋˜๊ณ  2๊ฐ€ ๋˜๊ฒŒ๋” ๋งŒ๋“œ๋Š” ๋ณ€์ˆ˜๋‹ค.

{
    title.map(function(a, i){ 
      return (
      <div className="list" key={i}> 
      <h4 button onClick={() => { setModal(!modal); setModalTitle(i) }}>{ title[i] })</h4>
      </div>)
      })
}

 

๋ฌผ๋ก , ๊ตณ์ด state๋ฅผ props๋กœ ๋‚ด๋ ค ์ค„ ํ•„์š” ์—†์ด ์•„๋ž˜์™€ ๊ฐ™์ด function Modal์— state๋ฅผ ์ž‘์„ฑํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ด modalTitle์€ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์“ฐ์ธ๋‹ค๋ฉด ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ function App์— ์ž‘์„ฑํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. state๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ๋Š” ์ „์†กํ•ด ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์•„๋ž˜์—์„œ ์œ„๋กœ๋Š” ์ „์†กํ•ด ์ฃผ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

function Modal(props) {
let [modalTitle, setModalTitle] = useState(0); // state๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๋„ ์ž‘์„ฑ
  return(
    <div className='modal'>
      <h4>{ props.title[props.modalTitle] }</h4>

 

 

๐Ÿคฉ ๊ฐœ์„ ํ•œ ์ฝ”๋“œ

import './App.css';
import logo from './logo.svg';
import { useState } from 'react';

function App() {
  let post = '๐Ÿค™ ๋‚˜๋งŒ ์•„๋Š” ๋ง›์ง‘ ์ œ๋ณดํ•˜๊ธฐ'; 
  let [title, setTitle] = useState(['์„ฑ์ˆ˜์—ญ', '๊ฐ•๋‚จ์—ญ', '์••๊ตฌ์ •์—ญ']);
  let [thumb, setThumb] = useState([0,0,0]);
  let [modal, setModal] = useState(false); 
  let [modalTitle, setModalTitle] = useState(0);
{
    title.map(function(a, i){ 
      return (
      <div className="list" key={i}> 
      <h4 button onClick={() => { setModal(!modal); setModalTitle(i) }}>{ title[i] })</h4>
      </div>)
      })
}
// ... ์ƒ๋žต

      {modal === true ? <Modal 
      title={title} 
      setTitle={setTitle}
      modalTitle={modalTitle}
      /> : ''}
      
      <h4>{ post }</h4> 
    </div>
  );
}
function Modal(props) {
  return(
    <div className='modal'>
      <h4>{ props.title[props.modalTitle] }</h4>
    </div>
  )
}

export default App;

 

 

๐Ÿฅณ ๊ธฐ๋Šฅ ๊ตฌํ˜„

 

 

 

๋Œ“๊ธ€