RealJS 5 5 5日目


#6.0 Getting Ready for the Router

  • react-router-dom:ナビのパッケージを作る.npm i react-router-dom
  • #6.1 Building the Router

  • ルータのpathで必要なファイルに入ります.
  • Route対象の支柱
    -path:接続パス
    -component:実際のパス
    -exact
    このアトリビュートを設定しない場合は、path=「/」とpath=「/about」が同じ「/」を含むため、一緒にレンダリングされます.したがって、「true」に設定する必要があります.
  • import React from "react";
    import {HashRouter, Route} from "react-router-dom";
    import Home from "./routes/Home";
    import About from "./routes/About";
    import "./App.css"
    
    function App(){
      return (
        <HashRouter>
          <Route path="/" exact={true} component={Home} />
          <Route path="/about" component={About} />
        </HashRouter>
      );
    }
    
    export default App;

    #6.2 Building the Navigation

  • ページ移動時にaタグを使用することが多い.しかしaラベルはhtmlの新規ロードにより遅い.したがってreactはリンクをインポートします.
  • import React from "react";
    import {Link} from "react-router-dom";
    import "./Navigation.css";
    
    function Navigation(){
        return (
            <div className="nav">
                <Link to="/">Home</Link>
                <Link to="/about">About</Link>
            </div>
        );
    }
    
    export default Navigation;
  • すべてがルーターに書かれているわけではありません.しかしlinkはルータに書かなければなりません.
  • function App(){
      return (
        <HashRouter>
          <Navigation />
          <Route path="/" exact={true} component={Home} />
          <Route path="/about" component={About} />
        </HashRouter>
      );
    }

    #6.3 Sharing Props Between Routes

  • <Link to=""><Link>stringではなくobjectに移動して支柱を渡すことができます.
  • import React from "react";
    import PropTypes from "prop-types";
    import {Link} from "react-router-dom";
    import "./Movies.css";
    
    function Movie({id, year, title, summary, poster, genres}){
        return (
            <Link to={{
                pathname: "/movie_detail",
                state: {
                    year,
                    title,
                    summary,
                    poster,
                    genres
                }
            }}
            >
                <div className="movie">
                    <img src={poster} alt={title} title={title}/>
                    <div className="movie__data">
                        <h3 className="movie__title">{title}</h3>
                        <h5 className="movie__year">{year}</h5>
                        <ul className="movie__genres">
                            {genres.map((genre, index) => ( //map함수에 index 자동 생성
                            <li key={index} className="genres__genre">{genre}</li> //key값 추가해줘야함 
                                ))}
                        </ul>
                        <p className="movies__summary">{summary.slice(0,180)}...</p>
                    </div>
                </div>
            </Link>
        );
    }
    
    Movie.propTypes = {
        id: PropTypes.number.isRequired,
        year: PropTypes.number.isRequired,
        title: PropTypes.string.isRequired,
        summary: PropTypes.string.isRequired,
        poster: PropTypes.string.isRequired,
        genres: PropTypes.arrayOf(PropTypes.string).isRequired
    };
    
    export default Movie;

    #6.4 Redirecting

  • 「ホームページ」を経ずに「Detail」に入った場合、料金を払う必要がなく、エラーが発生する可能性があります.このとき受け取った値がなければ、「ホーム」に戻らせてください.これがリダイレクトです.
  • import React from "react";
    
    class Detail extends React.Component{
        componentDidMount(){
            const {location, history} = this.props;
            if(location.state === undefined){
                history.push("/");
            }
        }
        render(){
            const {location} = this.props;
            if(location.state){
                return <h1>{location.state.title}</h1>
            }else{
                return null;
            }
            
        }
    }
    
    export default Detail;