ReactRouter基础

ReactRouter基础

本质上react-router有三个模块,react-router、react-router-dom、react-router-native

在React项目中,路由实现需要使用react-router-dom模块

react-router安装

# npm
npm i --save react-router-dom

# yarn
yarn add react-router-dom

react-router的使用

我们需要在我们的项目中引入react-router-dom

import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom'

BrowserRouter/HashRouter

如果我们要使用路由,那么应该在App.js中用BrowserRouter包着所有的代码

前者路由url中不带#,后者带#

BrowserRouter基于HTML5的pushState操作,HashRouter基于hash操作

一个页面只会有一个Router

import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom'
function App () {
  return (
    <div className="app">
      <Router>
      
      </Router>
    </div>
  )
}

Route

每一个路由都放在一个Route里

<Router>
  <!-- 第一种写法 -->
  <Route path="路由路径">
    <Component a={1}></Component>
  </Route>
  <!-- 第二种写法 -->
  <Route path="路由路径" component={组件}></Route>
  <!-- 第三种写法 -->
  <Route path="路由路径" render={(props) => <Component {...props} a={1}></Component>}></Route>
</Router>

上面的三种方式区别在于组件内部的props的内容

function Page (props) {
  // 第一种方式 props中只能获取到我们添加到组件上的自定义属性
  // 第二种方式 props中包含了所有的路由信息 不包含自定义属性,也无法设置
  // 第三种方式 porps默认为空,可以添加自定义属性,如果想要有路由信息,需要我们设置对应props传递
  return (
    <div></div>
  )
}
exact

精确匹配,如果不添加该属性 path="/" 也会匹配到 /xxx,可以给Route添加该属性

<Route exact></Route>

Switch

如果Route的path和url匹配,则对应的Route的组件就会渲染,Switch控制了Route只能渲染匹配到的第一个。

<Router>
  <Switch>
    <Route path="路由路径">
      <Component></Component>
    </Route>
    <!-- 第二种写法 -->
    <Route path="路由路径" component={组件}></Route>
    <!-- 第三种写法 -->
    <Route path="路由路径" render={() => <Component></Component>}></Route>
  </Switch>
</Router>

Link

会被渲染成a标签,和vue的router-link相同

<Link to="path">链接名称</Link>

NavLink

和Link的区别在于NavLink会根据当前URL匹配对应的a标签添加类名 active

<NavLink to="path">链接名称</NavLink>

路由配置

如果想要像vue一样实现路由的配置,我们可以自己写配置,并根据配置渲染出对应的路由结构

安装 react-router-dom

安装 react-router-dom

yarn add react-router-config

配置好routes

const routes = [
  // 同级重定向
  {
    path: "/redirect",
    render: () => <Redirect to="/demo1"/>
  },
  {
    path: "/",
    exact: true,
    component: Index
  }, {
    path: "/demo1",
    component: Demo1,
    // 子路由配置
    routes: [
      {
        path: "/demo1/child1",
        component: Child1
      },
      // 重定向 父 -> 子
      {
        path: "/demo1",
        render: () => <Redirect to="/demo1/child1"/>
      }
    ]
  }
]

在App.js中添加函数

import { BrowserRouter as Router } from 'react-router-dom'
import { renderRoutes } from 'react-router-config'
import routes from '路由配置路径'

function App () {
  return (
    <div className="App">
      <Router>
        {renderRoutes(routes)}
      </Router>
    </div>
  )
}

找到有子路由的组件

import { renderRoutes } from 'react-router-config'
function 组件名 ({route}) {
  return (
    <div>
      {renderRoutes(route.routes)}
    </div>
  )
}

饿了么路由配置

- /shop
- /
  - /msite
  - /discover
  - /order
  - /profile
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值