본문 바로가기
카테고리 없음

REACT] REACT ROUTER로 리스트 조회 페이지 만들기

by Fastlane 2020. 10. 14.
728x90
반응형

1. Get gists API 

api.github.com/gists

git리스트를 가져와서 페이지 좌측에 리스트를 보여주고, 클릭 시 우측에 상세내역을 표시하는 페이지를 Router를 활용하여 만들어보자. 

2. Create Sidebar, Main Section Using Router

react-router-dom package를 install한다. 

yarn add react-router-dom

react-router-dom의 BrowserRouter, Link, Route를 import한다. 

BrowserRouter로 warp한다. 

import React from 'react';
//라우터를 사용하기 위해서는 BrowserRouter, Link, Route가 필요하다.
import { BrowserRouter as Router, Link, Route } from 'react-router-dom';
import './App.css';

class App extends React.Component {

  state = {
    gists: null
  }

//api 호출하여 gists state에 값을 set 해준다. 
  componentDidMount() {
    fetch("https://api.github.com/gists")
      .then(res => res.json())
      .then(gists => {
        this.setState({ gists })
      })
  }

  render() {
    const { gists } = this.state;
    return (

      // 라우터를 사용하기 위해서 BrowserRouter로 wrap한다. 
      <Router>
        <div className="Sidebar">
          {gists ? (
            gists.map(gist => (
              <div key={gist.id} className="text-ellipsis">
                // Link에 to로 이동할 경로를 세팅한다. 
                <Link to={`/g/${gist.id}`}>
                  {gist.description || '[no description]'} {/*f || t returns true*/}
                </Link>
              </div>
            ))
          ) : (
              <div>Loading...</div>
            )}
        </div>
        <div className="Main">
          // path에 경로와 매핑할 component또는 render할 태그를 세팅한다. 
          <Route exact={true} path="/" render={() => (
            <h1>Welcome</h1>
          )}></Route>
          {gists && (
            <Route path="/g/:gistId" component={Gist}></Route>
          )}
        </div>
      </Router>

    )
  };
}
const Gist = ({ match }) => (
  <div>
    {match.params.gistId}
  </div>
)
export default App;
.Sidebar {
  background-color: #ccc;
  width:30%;
  float: left;
}

.Sidebar a {
  text-decoration: underline;
}

.text-ellipsis {  
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  word-break: break-all;
  text-overflow: ellipsis;
  overflow: hidden;
}

.Main {
  font-size: 32px;
  float: left;
  padding: .5rem .75rem;
}

output : 기본 url 에서는 Welcome이 표시된다. 

Sidebar를 선택할 때마다 URL마지막 부분에 parameter로 gistId가 전달되어야 한다. 

: colon으로 parameter를 세팅할 수 있으며, route param은 gistId로 called된다. 

<Route path="/g/:gistId" component={Gist}></Route>

 

Sidebar에 Link를 클릭하면 url이 변경되며, 우측에 git id가 표시된다. 

3. Router match 

링크 클릭시 매핑되는 컴포넌트에서 전달받는 match에는 다음과 같은 값들이 들어있다. 

match.params....로 전달받은 dynamic parameter값을 사용할 수 있다. 

 

이제, 매핑되는 컴포넌트에 git 상세데이터를 표기하도록 변경해보자. 

import React from 'react';
import { BrowserRouter as Router, Link, Route } from 'react-router-dom';
import './App.css';

class App extends React.Component {

  state = {
    gists: null
  }

  componentDidMount() {
    fetch("https://api.github.com/gists")
      .then(res => res.json())
      .then(gists => {
        this.setState({ gists })
      })
  }

  render() {
    const { gists } = this.state;
    return (
      <Router>
        <div className="Sidebar">
          {gists ? (
            gists.map(gist => (
              <div key={gist.id} className="text-ellipsis">
                <Link to={`/g/${gist.id}`}>
                  {gist.description || '[no description]'} {/*f || t returns true*/}
                </Link>
              </div>
            ))
          ) : (
              <div>Loading...</div>
            )}
        </div>
        <div className="Main">
          <Route exact={true} path="/" render={() => (
            <h1>Welcome</h1>
          )}></Route>
          {gists && (     
            <Route path="/g/:gistId" render={({ match }) => (
              <Gist gist={gists.find(g => g.id === match.params.gistId)} />
            )} />            
          )}
        </div>
      </Router>

    )
  };
}

const Gist = ({ gist }) => {
  return (
    <div>
      <h1>{gist.description || 'No Description'}</h1>
      <ul>
        {Object.keys(gist.files).map(key =>
          <li key={key}>
            {gist.files[key].filename}
          </li>
        )}
      </ul>
    </div>
  )
}

export default App;

output : 링크를 클릭 시, 우측 화면에 해당 git의 description과 file리스트가 보여진다. 

4. Conclusion

React Router를 사용하기 위해서는 react-router-dom package를 설치하여 사용한다. 

BrowserRouter, Link, Route를 import한다. 

Link Router에 dynamic param을 전달하여 사용할 수 있으며, match로 dynamic param값을 찾을 수 있다. 

728x90
반응형

댓글