React-Router

215 阅读1分钟

概要

这篇专题描述 React Router 的相关注意事项

HashRouter 的使用

HashRouter 需要作为项目的根节点包裹所有的项目元素,通常是在 APP 组件中使用,用来包裹入口,这时网站就会自动启用路由 并且,在一个项目中,只需要一个 HashRouter 元素即可

import { HashRouter, Route, Link } from 'react-router-dom'

// APP.jsx中
class APP extends React.Component {
    constructor(props) {
        super(props)
        this.state = {}
    }
    render() {
        return (
            <HashRouter>
                <div><h1>这时网站的APP根组件</h1></div>
            </HashRouter>
        )
    }
}

HashRouter 必须包含唯一根节点

// 不合法,会报错
class Test extends React.Component{
    render() {
        return <HashRouter>
            <div>
                <h1>这是网站的APP根组件</h1>
            </div>
            <p>这是另一个节点</p>
        </HashRouter>
    }
}
// 合法
class Test extends React.Component{
    render() {
        return <HashRouter>
            <div>
                <h1>这是网站的APP根组件</h1>
            </div>
        </HashRouter>
    }
}

默认的路由匹配规则

默认情况下,路由的匹配是模糊的,如果希望实现精确匹配,可以通过添加 exact 属性实现

import { HashRouter, Route, Link } from 'react-router-dom'
import Top from '@/components/top.jsx'

// 规则1
<Route path="/movie" component={Top}></Route>
// 对于规则1,以下都会达成匹配条件
<Link to="/movie">Movie</Link>
<Link to="/movie/top100">Movie</Link>
<Link to="/moveie/top100/10">Movie</Link>

// 如果想实现精确匹配,可以通过给 Route 标签添加 exact 属性
<Route path="/movie" component={Top} exact></Route>
// 此时,只有“/movie”才会匹配该规则

在路由规则中使用并获取参数

/home/article/100类似这样的动态路由非常常见,通过不同的文章 id 来读取不同的文章,这时文章 id 便成为了路由中的参数

// 规则1
<Route path="/home/:type/:id" component={Home}></Route>

// 在Home组件内,获取type和id值
class Home extends React.Component {
    constructor(props){
        super(props)
    }
    componentWillMount() {
        // 获取type
        console.log(this.props.match.params.type)
        // 获取id
        console.log(this.props.match.params.id)
    }
}