react-router使用

本文详细介绍了React Router DOM的安装、基本使用、HashRouter和BrowserRouter的区别、Link和NavLink的用法、Route属性的解析,以及Redirect、Prompt、路由传参、withRouter的使用,同时展示了404页面的设置和路由嵌套的实现。通过实例代码,帮助读者深入理解React应用中的路由管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

npm install --save react-router-dom

基本使用

import React from "react";
import Home from "./pages/Home";
import Mine from "./pages/Mine";
import { BrowserRouter as Router, Route } from "react-router-dom";


function App() {
  return (
    <div className='App'>
      {/* Route 需要用 Router 组件包裹 */}
      <Router>
        <Route path='/home' component={Home}></Route>
        <Route path='/mine' component={Mine}></Route>
      </Router>
    </div>
  );
}

export default App;

HashRouter 和 BrowserRouter

HashRouter 是锚点形式和vue中的hash一致
BrowserRouter 是h5的history api 和vue的history一致

Link

类似于vue中的router-link

import React from "react";
import Home from "./pages/Home";
import Mine from "./pages/Mine";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

function App() {
  return (
    <div className='App'>
      {/* Route 需要用 Router 组件包裹 */}
      <Router>
        {/* 可以封装成一个 Nav 组件 */}
        <ul>
          <li>
            <Link to='/home'>home page</Link>
          </li>
          <li>
            <Link to='/mine'>mine page</Link>
          </li>
        </ul>
        <Route path='/home' component={Home}></Route>
        <Route path='/mine' component={Mine}></Route>
      </Router>
    </div>
  );
}

export default App;

to属性可以是字符串,也可以是对象

            <Link
              to={{
                pathname: "/mine",
                search: "?name=huxianc",
                hash: "#the-hash",
                state: { flag: "flag" }, // 页面url地址不会显示
              }}
            >
              mine page
            </Link>

NavLink

个人感觉是Link的超集,主要作用是给当前页面的Link默认新增一个叫active的类名,也可以通过activeClassName来自定义,同时也支持activeStyle

Route 属性

  • exact 精准匹配,path一模一样才会匹配
  • strict属性主要就是匹配反斜杠,规定是否匹配末尾包含反斜杠的路径,如果strict为true,则如果path中不包含反斜杠结尾,则他也不能匹配包含反斜杠结尾的路径,这个需要和exact结合使用
  • render
<Route path='/demo' render={() => <div>hello demo</div>}></Route>
import React from "react";
import Home from "./pages/Home";
import Mine from "./pages/Mine";
import NotFound from "./pages/NotFound";
import Demo from "./pages/Demo";
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";

function App() {
  return (
    <div className='App'>
      {/* Route 需要用 Router 组件包裹 */}
      <Router>
        {/* 可以封装成一个 Nav 组件 */}
        <ul>
          <li>
            <Link to='/home'>home page</Link>
          </li>
          <li>
            <Link to='/mine'>mine page</Link>
          </li>
        </ul>
        {/* switch 保证只能存在一个页面 */}
        <Switch>
          <Route path='/home' component={Home}></Route>
          <Route path='/mine' component={Mine}></Route>
          {/* <Route path='/demo' render={() => <div>hello demo</div>}></Route> */}
          <Route path='/demo' render={(props) => <Demo {...props} name="huxianc" />}></Route>
          <Route component={NotFound}></Route>
        </Switch>
      </Router>
    </div>
  );
}

export default App;

// Demo.jsx
import React from 'react'

const Demo = ({ name }) => {
  return <div>Demo:{name}</div>
}

export default Demo

Redirect

<Redirect from="/hellomine" to="/mine"></Redirect>

可以用来做权限判断,比如一个页面必须是登录了才能访问的

import React, { Component } from 'react'
import { Redirect } from 'react-router'


export default class Shop extends Component {
  state = {
    isLogin: false
  }

  render() {
    const { isLogin } = this.state
    return (
      <div>
        {
          isLogin ?
            <div>shop</div>
            : <Redirect to="/login"></Redirect>
        }
      </div>
    )
  }
}

404页面

import React from "react";
import Home from "./pages/Home";
import Mine from "./pages/Mine";
import NotFound from "./pages/NotFound";
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";

function App() {
  return (
    <div className='App'>
      {/* Route 需要用 Router 组件包裹 */}
      <Router>
        {/* 可以封装成一个 Nav 组件 */}
        <ul>
          <li>
            <Link to='/home'>home page</Link>
          </li>
          <li>
            <Link to='/mine'>mine page</Link>
          </li>
        </ul>
        {/* switch 保证只能存在一个页面 */}
        <Switch>
          <Route path='/home' component={Home}></Route>
          <Route path='/mine' component={Mine}></Route>
          <Route component={NotFound}></Route>
        </Switch>
      </Router>
    </div>
  );
}

export default App;

路由传参

{/* 参数后可以加一个 ? 表示该参数是可选参数,不然如果不带参数会到404 */}
{/* 多参数是继续拼接 /:arg? */}
<Route path='/home/:id' component={Home}></Route>
//home
import React from 'react'

export default class Mine extends React.Component {
  render() {
    return (
      <div>home:{this.props.match.params.id}</div>
    )
  }
}

获取参数

方案一
import React from 'react'

const Mine = (props) => {
  const params = new URLSearchParams(props.location.search)
  console.log(params.get("name"))

  return (
    <div>mine</div>
  )
}

export default Mine
方案二
import React from 'react'
import qs from "querystring"

const Mine = (props) => {
  const value = qs.parse(props.location.search.slice(1))
  console.log(value)

  return (
    <div>mine</div>
  )
}

export default Mine

withRouter

定义的class 导出为withRouter(class)

Prompt

离开页面前触发

<Prompt when={触发条件}  message={'提示文字'} />

路由嵌套

感觉有点像vue中的插槽
路由配置和其他的基本一致,只是通过插入父组件内部来实现
页面显示位置通过this.props.children来获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值