Studying/React

리액트 기초부터 쇼핑몰 프로젝트까지! Part2 #1 Bootstrap으로 기본틀 제작

코뿌 2023. 4. 27. 14:12

* 새로운 프로젝트 생성 & Bootstrap 사용하기

 

Bootstrap

: 레이아웃을 복사 붙여넣기 방식을 이용하여 편하게 개발할 수 있게 도와주는 외부 라이브러리

 

-  다운로드

react bootstrap 검색  or  https://react-bootstrap.github.io/ 방문 ->get started -> npm install react-bootstrap bootstrap 터미널에 입력 -> css 명령어도 입력 ( import 'bootstrap/dist/css/bootstrap.min.css';

App.js 파일 상단에 입력)

(설치 명령어는 바뀔 수 있기 때문에 react-bootstrap 사이트에서 꼭 확인 필요함)

 

- 사용 예시

: button UI 가져다 쓰기

 

1. 상단에 import 하고 

import Button from 'react-bootstrap/Button';

2 버튼 두고 싶은 곳에 원하는 거 복붙하기

function App() {
  return (
    <div className='App'>
    <Button variant="outline-success">Success</Button>{' '}
    </div>
   
  );
}

 

- 가져온 거 CSS 수정하기

-> 이부분은 더 공부 필요함.

 

 

* 이미지 넣는 법 

 

css에서 넣기

원하는 이미지를 src 폴더에 넣은 뒤 App.css파일에서 url(./ 누르고 고르면 됨.

폴더에 있는 이미지를 열고 싶은 거면 url('./img/bg.png'); 치면 됨

./폴더명/파일명

 

html에서 이미지를 넣기

import 작명 from './img/bg,png';


function App() {
return(

<div className="main-bg" style={{ backgroundImage : 'url('+ 작명 +')' }}> </div>

 

 public 폴더 이용하기

public 폴더에도 이미지 보관이 가능함.

build 시 public 폴더 안에 있는 건 압축이 안 됨.

public 폴더 이미지를 html에서 사용할 때는 그냥 /이미지경로 쓰고 import 없이 사용가능

<img src="/logo192.png />

주의점

serve 경로에 발행하고 싶을 때는 경로를 추가해줘야됨

codingapple.com/ 에 발행할 땐 문제 안 되는데

codingapple.com/어쩌구/ 에 발행 시 문제가 됨.

<img src="/어쩌구/logo192.png" />

// 맨날 수정하기 싫으면 create react app 사이트 가서 시키는 대로 하단처럼 하면됨

<img src={process.env.PUBLIC_URL + '/img/logo192.png' } />;

 

 

* Import  &  Export

하단과 같이 서버에서 받아온 상품 object자료가 있다고 가정.

[
  {
    id : 0,
    title : "White and Black",
    content : "Born in France",
    price : 120000
  },

  {
    id : 1,
    title : "Red Knit",
    content : "Born in Seoul",
    price : 110000
  },

  {
    id : 2,
    title : "Grey Yordan",
    content : "Born in the States",
    price : 130000
  }
]

 

*) object 자료

let user = { name : 'kim', age : 20 }  // object 자료 형식

console.log(user.name)  // 원하는 자료 호출

 

 

서버에서 받아온 object 자료를 state에 저장해보기

import { useState } from 'react';

function App() {

let [shoes] = useState()

return (

 

상단의 내용을 다 저장하기엔 복잡하니까 따로 빼서 정리하려고 ->  import & export 사용

 

 

data.js라는 파일에 있는 변수를 App.js에 가져와서 쓰고 싶으면

Export

변수 하나일 때 

export default 변수명; 

 

변수가 여러 개 일 때

export { 변수명1, 변수명2 };

// (data.js파일)

let a = 10;
export default a;

let a = 10;
let b = 20;
export {a,b};

파일마다 export dafault 라는 키워드는 하나만 사용가능

변수, 함수, 자료형 전부 export 가능

 

Import

// App.js

import a from './data.js';


import { name1, name2 } from './data.js';

 

파일경로는 ./ 부터 시작해야됨, 현재 경로라는 뜻.

export { } 했던 것들은 import { } 쓸 때 자유작명이 불가능. export 했던 변수명 그대로 적어야함

// 원하는 곳에서 사용하기

function App() {
  let [shoes] = useState(data)
  return (

 

array 자료에서 원하는 정보만 바인딩하기

[ ]로 시작하면 array라고 생각하고 하단의 방식을 사용하면 됨.

{shoes[1].title}

// data가 저장된 shoes라는 state의 두번째차례의 배열1에서 title을 불러오겠다.

 

숙제 :

- 상품 설명 부분을 component화 하고 각각 다른 내용을 보여주게 만들어보자

function App() {
  let [shoes] = useState(data)
  return (
  
  
    <div className='container'>
      <div className='row'>
      <Information shoes={shoes[0]} b={1}></Information>
      <Information shoes={shoes[1]} b={2}></Information>
      <Information shoes={shoes[2]} b={3}></Information>
      </div>
    </div>
   </div>

부모에 있던 shoes라는 state를 보낼 때 각각 다른 정보를 props로 보내면 됨.

shoes[0], shoes[1], shoes[2]를 각각 보내줌.

 

사진도 각각 다르게 하려면 (이미지 주소가 shoes1.jpg /  shoes2.jps / shoe3.jpg 부분만 다르니까 그 부분을 다르게 보내줌)

props로 원하는 건 다 보낼 수 있으니까 자식 컴퍼넌트에서 바꿔주고 싶은 부분을 i라고 내 맘대로 작명해서 각각 다르게 보내줌.

function Information(props) {
  return(
   <div className='col-md-4'>
    <img src={"https://codingapple1.github.io/shop/shoes" + props.b + ".jpg"} width="80%" />
    <h4>{props.shoes.title}</h4>
    <p>{props.shoes.price}</p>
     </div>
  )
  }

문자 중간에 변수를 넣고 싶으면 '문자' + 변수 + '문자' 이렇게 하고 {}로 가두면 됨.

 

- 반복되는 부분 map으로 정리하기

데이터 갯수에 맞게 알아서 생성할 수 있게 만들 수 있음. (데이터가 너무 많거나 몇 개인지 파악할 수 없을 때 용이)

   {/* <Information shoes={shoes[0]} i={1}></Information>
      <Information shoes={shoes[1]} i={2}></Information>
      <Information shoes={shoes[2]} i={3}></Information> */}

상단처럼 반복되는 것들을 map으로 정리함.

function App() {
  let [shoes] = useState(data)
  return (
  
div className='container'>
      <div className='row'>
   
      {
        shoes.map(function(a,i){
          return (
            <Information shoes={shoes[i]} b={i+1}></Information>
          )
        })
      }