React 路由
1. 为什么要使用路由?
单页面实现页面的切换【 SPA的实现 】
可以通过URL对页面进行定位
语义化组织资源
2. react-router版本
react-router 目前在第五个版本
3. react-router官网文档
https://reacttraining.com/react-router/web/guides/quick-start
4. react-router效果演示
5. react-router使用
创建React项目
$ npx create-react-app router_app
$ cd router_app
$ yarn start安装react-router-dom
$ yarn add react-router-dom在项目入口文件中配置路由模式
import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import * as serviceWorker from './serviceWorker'; /* * 1. React路由模式有两种: 1. HashRouter[ #/home 传统浏览器模式 hashchange ] 2. BrowserRouter[ /home h5 history模式 ] * 2. BrowserRouter需要后端支持 * 3. as的作用是给一个模块起一个别名 */ import { BrowserRouter as Router } from 'react-router-dom' ReactDOM.render( <Router> <App /> </Router> , document.getElementById('root')); serviceWorker.unregister();在项目中新建index.js, src/router/index.js
import React, { Component,Fragment } from 'react' import Home from './../pages/home/index'; import Recommend from './../pages/recommend/index'; import Category from './../pages/category/index'; import Mine from './../pages/mine/index'; import ShopCar from './../pages/shopcar/index'; import NotFound from './../pages/notfound/index'; import Login from './../pages/login/index'; import Register from './../pages/register/index'; import List from './../pages/list/index'; import Detail from './../pages/detail/index'; import { Route,Switch,Redirect,withRouter } from 'react-router-dom' /* * Route是用来通过path路径来匹配对应的组件,一个Route组件就是一个路由的配置 * path 路由路径 * component 路由对应的组件 * render 可以渲染一个组件 * children 子组件 ! component / render /children 选一个使用 * component vs render vs children 1. 使用了Route并使用了component属性之后,我们的组件称之为路由组件,有路由属性【 history/location/match 】 2. 使用render的话,我们发现组件的路由属性是没有的,但是我们可以给我们的组件绑定数据了 3. 使用children的话,我们不仅可以绑定数据,也可以有路由属性 * Switch表示一次只渲染一个路由 * Redirect 重定向组件 ! exact 它表示路径完全匹配 / /home /home/hot */ export default class RouteComp extends Component{ render () { return ( <div> <Switch> <Redirect from = "/" to = "/home" exact/> <Route path = "/home" component = { Home }/> <Route path = "/recommend" component = { Recommend }/> <Route path = "/category" component = { Category }/> <Route path = "/shopcar" component = { ShopCar }/> {/* <Route path = "/mine" component = { Mine }/> */} {/* <Route path = "/mine" render = {() => <Mine name = { name } />}/> */} <Route path = "/mine" children = {() => <Mine name = { name } />}/> <Route path = "/login" component = { Login } /> <Route path = "/register" component = { Register } /> <Route path = "/list/:id" component = { List } /> <Route path = "/detail/:id" component = { Detail } /> <Route component = { NotFound }/> </Switch> </div> ) } }二级路由配置
import React,{ Component } from 'react' import { Route,NavLink } from 'react-router-dom' import Hot from './Hot.js' import Coming from './Coming.js' class Home extends Component{ render () { return ( <div> {/* 二级路由导航 */} <NavLink to = "/home/hot"> 正在热映 </NavLink> <NavLink to = "/home/coming"> 即将上映 </NavLink> {/* 二级路由展示区域 */} <Route path = "/home/hot" Component = { Hot } /> <Route path = "/home/coming" Component = { Coming } /> </div> ) } }动态路由
- 路由传参
- 路由接参
- 案例效果
- 移动端分类 -> 列表 -> 详情 -> 购物车
import React, { Component,Fragment } from 'react'
import { Link } from 'react-router-dom'
class Category extends Component{
render () {
const route = {
pathname: '/list/1',
search: 'cid=23&shopname=电脑'
}
return (
<Fragment>
<Link
to = { route }
>
商品一
</Link>
</Fragment>
)
}
}
路由接参 - 代码演示
import React, { Component,Fragment } from 'react'
import { Link } from 'react-router-dom'
import qs from 'querystring'
class Category extends Component{
render () {
const search = qs.parse( this.props.location.search.slice(1) )
const params = this.props.location.params
return (
<Fragment>
<p> 接收的id为: { params.id } </p>
<p> 接收的cid为: { search.cid } </p>
<p> 接收的shopname为: { search.shopname } </p>
</Fragment>
)
}
}
- 路由监听
- 移动端
- 某些界面效果显示有无
- 移动端