react路由

361 阅读3分钟

安装

  • 浏 览 器 端 应 用:npm install --save react-router-dom -S

  • React Native 应用:npm install --save react-router-native -S

使用

  • 路由安装完毕后,在入口文件中导入路由模块:(index.js)

import {BrowserRouter as Router} from "react-router-dom";

  • 把Router组件包在根组件上:(index.js)

ReactDOM.render(<Router><App /></Router>, window.app);

  • 在根组件(App.js)中引入Router

import { Route, Link } from "react-router-dom";

  • 在跟组件中定义规则

1.基础路由

import React from "react"
import { Route, Link } from "react-router-dom";
import Home from "./Home"
import List from "./List"
import User from "./User"
class App extends React.Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <div>
                <ul>
                    <li>
                        <Link to="/">首页</Link>
                    </li>
                    <li>
                        <Link to="/list">列表页</Link>
                    </li>
                    <li>
                        <Link to="/user">用户中心</Link>
                    </li>
                </ul>
                <Route path="/" exact component={Home}></Route>
                <Route path="/list" component={List}></Route>
                <Route path="/user" component={User}></Route>
            </div>
        )
    }
}
export default App;

2.嵌套路由

在基础路由的User组件中加如两个子组件Reg,Login,其他不变,故User组件代码更新为:

import React from "react";

import { Route, Link } from "react-router-dom";
import Reg from "../pages/user/Reg";
import Login from "../pages/user/Login";

export default class User extends React.Component {
  render() {
    return (
      <div>
        <h1>用户中心</h1>
        <Link to="/user/reg">注册</Link>
        <Link to="/user/login">登陆</Link>
        <Route path="/user/reg" component={Reg}></Route>
        <Route path="/user/login" component={Login}></Route>
      </div>
    );
  }
}

3.动态路由

增减一个页面级详情页面(Detail),下List中点击对应的商品,跳转到详情页

首先在根组件中定义规则

import Detail from "./pages/Detail"

<Route path="/detail/:id" component={Detail}></Route> //携带上商品id

在List中点击进行跳转(List.js)

import React from "react";

import { Link } from "react-router-dom";
export default class List extends React.Component {
  render() {
    return (
      <div>
        <h1>列表页</h1>
        <ul>
          <li>
            <Link to="/detail/1">第1条商品详情</Link>
          </li>
          <li>
            <Link to="/detail/2">第2条商品详情</Link>
          </li>
          <li>
            <Link to="/detail/3">第3条商品详情</Link>
          </li>
          <li>
            <Link to="/detail/4">第4条商品详情</Link>
          </li>
        </ul>
      </div>
    );
  }
}

在Detail组件中接收并使用id

import React from "react";
// 得到id,发起axios请求,获取详情的数据
export default class Detail extends React.Component {
  componentDidMount() {
    console.log(this.props.match.params.id);
  }
  render() {
    return (
      <div>
      
        <h3>商品详情页面</h3>
        <h5>
          {"发起axios请求获取" + this.props.match.params.id + "号商品的数据"}
        </h5>
      </div>
    );
  }
}

4.编程式路由

首先引入history模块并创建history(在那个组件使用就在那个组件引入)

import { createBrowserHistory } from 'history';
let history = createBrowserHistory({
    forceRefresh:true  //强制刷新
});

在Detail组件中使用,点击返回上一级(Detail.js)

  <button onClick={()=>{history.goBack()}}>返回</button> 
  <button onClick={()=>{history.go(-1)}}>返回</button>

在列表页使用,点进跳转任意路由(List.js)

注意 :使用动态路由中的push时,不会自动跳转,需要强制刷新

<button onClick={()=>history.push("/detail/1000")}>到100号商品</button> forceRefresh:true //强制刷新

5.重定向路由&Switch

目的:在App组件中,当用户点击User时,重定向到Home组件,(App.js)

当匹配不到页面时,显示404组件

import { Route, Link,Redirect,Switch } from "react-router-dom";

        {/* 配置规则 */}
        <Switch>
          {/* 重定向路由 */}
          <Redirect from="/user" to="/" />
          <Route path="/" exact component={Home}></Route>
          <Route path="/list" component={List}></Route>
          <Route path="/user" component={User}></Route>
          <Route path="/detail/:id" component={Detail}></Route>
          <Route component={Err}></Route>
        </Switch>