React Project6. Link, Switch, history 기능

Steve·2021년 5월 21일

Link태그, Switch태그, history에 대하여 알아보자
Detail 페이지의 내용을 Component화 해보자
App.js 내용이 너무 길어지니 따로 파일을 만들고 import해오자

(Detail.js 파일)

import React from 'react';

function Detail(){
  return (
    <div className="container">
      <div className="row">
        <div className="col-md-6">
          <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
        </div>
        <div className="col-md-6 mt-4">
          <h4 className="pt-5">상품명</h4>
          <p>상품설명</p>
          <p>120000</p>
          <button className="btn btn-danger">주문하기</button> 
        </div>
      </div>
  </div>  
  )
};

export default Detail 
// 다른파일에서 자유롭게 import할수 있게됨
  1. src 폴더에 Detail.js 생성
  2. 항상 맨위에 import React
  3. Detail 함수 export
(App.js 파일)

import 많은 곳;
import Detail from './Detail.js';
function App(){
  return (
    <div>
      <Navbar></Navbar> (상단메뉴 레이아웃)
      
      <Route path="/"> 
        <Jumbotron></Jumbotron> (Jumbotron 대문 레이아웃)
        <>상품3개 카드 레이아웃</>
      </Route>

      <Route path="/detail">
        <Detail/>
      </Route>
    </div>
  )
}

이제 배웠으니 컴포넌트가 길어지면 얼마든지 다른 파일로 빼서 저장해두십시오.
(import/export 문법이랑 import React 이것만 잘 기억하시면 됩니다.)

(App.js 파일)

function App(){
  return (
    <div>
      <Navbar>
         <Nav.Link> <Link>Home</Link> </Nav.Link>
         <Nav.Link> <Link>Detail</Link> </Nav.Link>
      </Navbar> 
      <나머지HTML/>
    </div>
  )
}

▲ Navbar 컴포넌트 안에 Nav.Link 라는 컴포넌트에 여러가지 버튼들이 있습니다.
페이지 이동버튼으로 바꾸길 원하는 글자들에 태그를 감싸보시길 바랍니다.
(Link 태그는 이전 시간에 ‘react-router-dom’과 함께 상단에 import 해온 컴포넌트입니다)

  (App.js 파일)

function App(){
  return (
    <div>
      <Navbar>
         <Nav.Link> <Link to="/">Home</Link> </Nav.Link>
         <Nav.Link> <Link to="/detail">Detail</Link> </Nav.Link>
      </Navbar> 
      <나머지HTML/>
    </div>
  )
}

▲ 그 다음에 to 라는 속성과 경로 작성.
– Link 태그를 사용하고
– to 속성을 이용해 경로만 지정해주면 됩니다.
어찌보면 a 태그 만드는 것과 매우 유사합니다.

그럼 Detail이라는 글자를 누르면 /detail 경로
Home이라는 글자를 누르면 / 경로로 이동합니다.

useHistory() 이용하여 다른페이지 이동하기

(Detail.js 파일)

import React from 'react';
import { useHistory } from 'react-router-dom';

function Detail(){
  
  let history = useHistory();
  return (
    <div className="container">
      <div className="row">
        <div className="col-md-6">
          <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
        </div>
        <div className="col-md-6 mt-4">
          <h4 className="pt-5">상품명</h4>
          <p>상품설명</p>
          <p>120000</p>
          <button className="btn btn-danger">주문하기</button> 
          <button className="btn btn-danger">뒤로가기</button> 
        </div>
      </div>
  </div>  
  )
};
  
export default Detail 

useHistory()는 코딩생활을 편하게 해주는 일종의 Hook입니다. (useState 이런거랑 비슷한겁니다)
history 라는 변수엔 큰 object {} 자료가 하나 저장되고
그 object 안에는 페이지 이동 내역 + 유용한 함수가 저장되어있습니다.

<button onClick={()=>{ history.goBack() }} className="btn btn-danger">뒤로가기</button> 

history.goback() 을 이용하면 페이지가 뒤로감

여기서 질문. 이런걸 어케 알고 코드를 짜나?
라이브러리 사용법은 구글링해야함.
커스텀 페이지로 이동하려면 history.push() 사용하면됨

<button onClick={()=>{ history.push('/') }} className="btn btn-danger">뒤로가기</button> 

push() 라는 함수를 쓰고 안에 경로를 입력하면 그 경로로 이동

Switch 컴포넌트에 대해 알아보자

import { Switch } from 'react-router-dom'
Switch 태그는 Route를 전부 보여주지 말고 한번에 하나만 보여달라~ 라는 뜻.

Ex)

  (App.js 파일)

function App(){
  return (
    <div>
      <나머지HTML/>
      <Route exact path="/">
        어쩌구
      </Route>
      <Route path="/detail">
        <Detail/> // 1번코드
      </Route>
      <Route path="/:id">
        <div>새로 만든 route입니다</div> // 2번코드
      </Route>
    </div>
  )
}

path="/:id"
이 코드는 / 슬래뒤 뒤에 모든 문자가 오면 이 Route로 안내해주세요~ 라는 뜻/

Q. 그럼 /detail로 이동하면 어떤게 보이죠?
A. 1번코드와 2번 코드 모두 보여준다.
리액트 라우터는 그냥 URL 매치되는 것들 전부 다 보여주기 때문!!

이런걸 방지하고 하나의 Route태그만 보여주고싶다면 Route들을 Switch 태그로 감싸면 됨

  <Switch>
    <Route exact path="/">
      어쩌구
    </Route>
    <Route path="/detail">
      <Detail/>
    </Route>
    <Route path="/:id">
      <div>새로 만든 route입니다</div>
    </Route>
  </Switch>

다 감싸면 이제 여러개의 Route가 매칭이 되어도 맨 위의 Route 하나만 보여줍니다.

Link와 history.push의 차이(아마도??) 다시 찾아보기

Link는 기능 없이 클릭하면 무조건이동
history.push는 함수같은 조건을 넣을수있음

profile
Front-Dev

0개의 댓글