Post

[React] 6강 | div 너무 많으면 Component

[2022 코딩애플 리액트 강의] www.youtube.com/@codingapple

[React] 6강 | div 너무 많으면 Component

모달창 레이아웃 디자인하기


  • 상세페이지를 담당할 모달 UI
    • App.jsx
      1
      2
      3
      4
      5
      
        <div className="modal">
          <h4>제목</h4>
          <p>날짜</p>
          <p>상세내용</p>
        </div>
      
    • App.css
      1
      2
      3
      4
      5
      6
      
        .modal {
        margin-top: 20px;
        padding: 20px;
        background: #eee;
        text-align: left;
        }
      

Component 문법


  • 컴포넌트 만드는 법
    1. fucntion 만들고 (다른 function 바깥에서, 함수명은 영어 대문자로 시작)
    2. return() 안에 html 담기 (병렬로 태그 2개 이상 기입 x)
    3. <함수명></함수명> 쓰기
  • App.jsx
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      function Modal() {
      return (
          <div className="modal">
          <h4>제목</h4>
          <p>날짜</p>
          <p>상세내용</p>
      </div>
      )
      }
    
    1
    
      <Modal></Modal> // </Modal>만 입력해도 된다
    
  • return() 안에 html 병렬 기입하려면 하나의 <div></div>로 감싸기 (혹은 <></>: fragment 문법)
  • 어떤 것을 컴포넌트로 만들면 좋은가
    1. 반복적인 html 축약
    2. 큰 페이지들 자체를 컴포넌트로 (페이지 전환 등에 사용)
    3. 자주 변경되는 UI 등
  • 컴포넌트의 단점
    1. 다른 함수 바깥에 있기 때문에 state 가져다쓸 때 문제가 생김
  • 컴포넌트 만드는 법 2
    1. ex) const Modal = () => {}

6강까지


  • App.jsx
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    
      import { useState } from 'react'
      import reactLogo from './assets/react.svg'
      import viteLogo from '/vite.svg'
      import './App.css'
    
      function App() {
    
          let [글제목, 글제목변경] = useState(['스팀 할인 목록', '3월 전시 목록', '2025 영화 개봉작 목록'])
    
          let [하트, 하트변경] = useState([0, 0, 0]);
    
          return (
              <div className="App">
              <div className="black-nav">
              <h4 style=>MyBlog</h4>
              </div>
    
              <button onClick={ ()=>{
              let copy = [...글제목]
              글제목변경(copy.sort())
              }}>
              가나다순정렬
              </button>
    
              <button onClick={ ()=>{
              let copy = [...글제목]
              copy[0] = '스팀 할인 기간'
              글제목변경(copy)
              }}>글수정</button>
    
              <div className="list">
              <h4>{글제목[0]}<span onClick={ ()=> { 
                  let copy = [...하트]
                  copy[0] = (copy[0]+1)
                  하트변경(copy)
              }}> ❤️</span> {하트[0]} </h4>
              <p>2월 18일 발행</p>
              </div>
    
              <div className="list">
              <h4>{글제목[1]}<span onClick={ ()=> { 
                  let copy = [...하트]
                  copy[1] = (copy[1]+1)
                  하트변경(copy)
              }}> ❤️</span> {하트[1]} </h4>
              <p>2월 18일 발행</p>
              </div>
    
              <div className="list">
              <h4>{글제목[2]}<span onClick={ ()=> { 
                  let copy = [...하트]
                  copy[2] = (copy[2]+1)
                  하트변경(copy)
              }}> ❤️</span> {하트[2]} </h4>
              <p>2월 18일 발행</p>
              </div>
    
              <Modal></Modal>
              <Ad></Ad>
    
              </div>
                
          )
      }
    
      function Modal() {
      return (
          <div className="modal">
          <h4>제목</h4>
          <p>날짜</p>
          <p>상세내용</p>
          </div>
      )
      }
    
      const Ad = () => {
      return (
          <div className="ad">
          <h4>광고</h4>
          <p>싸다 싸</p>
          <p>젤다 닌텐도칩이 단돈 9,900원</p>
          </div>
      )
      } 
    
      export default App
    
  • App.css
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
      .black-nav {
      display: flex;
      background: black;
      width: 100%;
      color: white;
      padding-left: 20px;
      }
    
      div {
      box-sizing: border-box;
      }
      .list {
      padding-left: 20px;
      text-align: left;
      border-bottom: 1px solid grey;
      }
    
      .modal {
      margin-top: 20px;
      padding: 20px;
      background: #eee;
      text-align: left;
      }
      .ad {
      margin-top: 30px;
      padding: 5px;
      background: #b32f2f;
      color: white;
      text-align: left;
      }
    
  • 이미지
    1
This post is licensed under CC BY 4.0 by the author.