react的路由分为web端、native端、any所有端都能使用的路由,目前学习web端的
1. 明确好界面中的导航区、展示区
import {Link,Route} from 'react-router-dom'
2. 导航区的a标签改为Link标签
<div className="list-group">
{/* About
Home */}
<Link className="list-group-item active" to="/about">About</Link>
<Link className="list-group-item" to="/home">Home</Link>
</div>
3. 展示区写Route标签进行路径的匹配
<div className="panel-body">
{/* 注册路由 */}
<Route path="/about" component={About} />
<Route path="/home" component={Home} />
</div>
4. App组件的最外侧包裹一个<BrowserRouter></BrowserRouter> 或者<HashRouter></HashRouter>
// 引入路由
import { BrowserRouter } from 'react-router-dom';
root.render(
// 严格模式
<BrowserRouter>
<React.StrictMode>
<App />
</React.StrictMode>
</BrowserRouter>
);
1. 写法不同
一般组件:<Demo/>
路由组件:<Route path="/demo> component={Demo}>
2. 存放位置不同
一般组件:component
路由组件:pages
3. 接收到的props不同
一般组件:写组件标签时传递了什么,就能接收到什么
路由组件:接收到三个固定的属性
1. NavLink可以实现路由链接的高亮,通过activeClassName指定样式名
2. 标签体聂荣时一个特殊的标签属性
3. 通过this.props.children可以获取标签体内容
MyNavLink.jsx
import React, { Component } from 'react'
import { NavLink } from 'react-router-dom'
export default class MyNavLink extends Component {
render() {
return (
<NavLink className="list-group-item" {...this.props}></NavLink>
)
}
}
使用
import MyNavLink from './components/MyNavLink'
<NavLink className="list-group-item" to="/home">Home</NavLink>
<MyNavLink to="/about" children="About" />
1. 通常情况下,path和component是一一对应关系
2. Switch可以提高路由匹配效率(单一匹配)
1. public/index.html中引入样式不写 ./ 写 / (常用)
2. public/index.html中引入样式不写 ./ 写 %PUBLIC_URL%
3. 使用HashRouter
这样也行
<MyNavLink to="/about/q" children="About" />
{/* 注册路由 */}
<Route path="/about" component={About} />
开启exact就不行了
<MyNavLink to="/about/q" children="About" />
<Route exact path="/about" component={About} />
当路由都匹配不上的时候重定向到/about
{/* 注册路由 */}
<Route exact path="/about" component={About} />
<Route path="/home" component={Home} />
<Redirect to="/about" />
1. 注册子路由时要写上父路由的path值
2. 路由匹配时按照注册路由的顺序进行的
<div className="panel-body">
<div>
<h2>Home组件内容</h2>
<div>
<ul className="nav nav-tabs">
<li>
<MyNavLink to="/home/news" children="news" />
</li>
<li>
<MyNavLink to="/home/message" children="message" />
</li>
</ul>
</div>
{/* 注册路由 */}
<Switch>
<Route path="/home/news" component={News} />
<Route path="/home/message" component={Message} />
<Redirect to="/home" />
</Switch>
</div>
</div>
1.params参数
路由链接(携带参数):<Link to={`/home/message/detail/${msgObj.id}`}>{msgObj.title}</Link>
注册路由(声明接收):<Route path="/home/message/detail/:id" component={Detail} />
接收参数:const {id} = this.props.match.params
2.search参数
路由链接(携带参数):<Link to={`/home/message/detail?id=${msgObj.id}`}>{msgObj.title}</Link>
注册路由不需要声明<Route path="/home/message/detail" component={Detail} />
接收参数:const queryStr = this.props.location.search
格式化参数:导入import qs from 'qs'
使用qs格式化const {id} = qs.parse(queryStr.slice(1))
3.state参数
路由链接(携带参数):<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id}}}>{msgObj.title}</Link>
接收参数:const {id} = this.props.location.state
<Link replace={true} to={{pathname:'/home/message/detail',state:{id:msgObj.id}}}>{msgObj.title}</Link>
不会留下痕迹
默认跳转push会留下浏览痕迹
<button onClick={()=>this.pushShow(msgObj.id)}>push</button>
<button onClick={()=>this.replaceShow(msgObj.id)}>show</button>
pushShow = (id)=>{
this.props.history.push(`/home/message/detail?id=${id}`)
}
replaceShow = (id)=>{
this.props.history.replace(`/home/message/detail?id=${id}`)
}
一般组件中没有this.props.history属性,路由组件中才会有
可以将一个一般组件转化为路由组件
用法:
import { withRouter } from 'react-router-dom/cjs/react-router-dom.min';
class Header extends Component {
...
}
export default withRouter(Header)