React Router

一、简介

react router是一个构建基于react应用的路由管理库。允许你在程序中定义不同的路由和导航规则。以实现不同的url路径显示不同的组件。

二、相关技术

javascript 复制代码
<Router>
    <div>
        <ul id = "menu">
            <li><Link to = "/home">Home</Link></li>
            <li><Link to = "/hello">Hello</Link></li>
            <li><Link to = "/about">About</Link></li>
        </ul>
        
        <div id = "page-container">
            <Route path = "/home" component = {Home} />
            <Route path = "/hello" component = {Hello} />
            <Route path = "/about" component = {About} />
        </div>
    </div>
</Router>

Link实现导航跳转

Route 配置路由定义,对应组件会填充父组件。

React Router API

Link -> <Link to = '/about'>About</Link> 普通连接,不会触发浏览器刷新

NavLink -> <NavLink to = '/about' activieClassName = "selected">About</NavLink >

Prompt ->

javascript 复制代码
 <Prompt when = {fromIsHalfFilledOut}  message = "Are you sure you want to leave"/>

Redirect ->

javascript 复制代码
 <Route  exact path = "/" 
  render = {() => (loggedIn ? (<Redirect to "/dashboard"/>):
 (<PublicHomePage/>))} />

url传参

react 组件可以通过 match props 获取Route 中url对应的占位符值。

javascript 复制代码
// 通过match属性获取Route Path中的占位符值
const Topic = ({match}) => (
    <h1>Topic {match.params.id}</h1>
); 

export default class RouterParams extends React.PureComponent{
    render(){
        return (
            <Router>
                <div>
                    <ul id = "menu">
                        <li><Link to = '/topic/1'>Topic 1</Link></li>
                        <li><Link to = '/topic/2'>Topic 2</Link></li>
                        <li><Link to = '/topic/3'>Topic 3</Link></li>
                    </ul>
                    <div id = "page-container">
                        <Route path = "/topic/:id" component = {Topic} />
                    </div>
                </div>
            </Router>
        );
    
    }

}

默认情况下,直接修改浏览器地址是不会触发跳转的,必须通过Link或者其它React routeApi实现跳转。

嵌套路由

1.每个React组件都是路由容器。

2.React Router的声明式语法可以方便的定义嵌套路由。

举个多级目录嵌套路由例子

javascript 复制代码
// 一级目录
export const Category = () => {
    return () => {
        <Router>
            <div>
                <ul id = "menu">
                    <li><Link to = "/category/1">Category 1</Link></li>
                    <li><Link to = "/category/2">Category 2</Link></li>
                    <li><Link to = "/category/3">Category 3</Link></li>
                </ul>
                <div id = "nav-container">
                    <Route path = "/category/:id" component = {SubCategory}>
                </div>
            </div>
        </Router>
    }
}


// 二级目录
export const SecondCategory = ({match}) => {
    return () => {
        <Router>
         <div>
           <ul id = "menu">
             <li><Link to = "/category/${match.params.id}/sub/1">Category 1</Link></li>
             <li><Link to = "/category/${match.params.id}/sub/2">Category 2</Link></li>
             <li><Link to = "/category/${match.params.id}/sub/3">Category 3</Link></li>
           </ul>
           <div id = "page-container">
             <Route path = "/category/:id/sub/:subId" component = {Page}>
           </div>
         </div>            
        </Router>
    }
}


// 页面内容
export const Page = ({match}) =>{
    const data = getPageData(match.params.id, match.params.subid);
    return parseData(data);
}
相关推荐
Flynt13 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn13 小时前
bundle优化
前端
北冥有鱼14 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚14 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户372037492601814 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能14 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师14 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端
alsmile14 小时前
AI友好的可视化图形引擎自我革命:Meta2d.js 2.0 历时一年全新重写,性能与多人协作全面升级
前端·开源·数据可视化
行思理14 小时前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
粥里有勺糖14 小时前
视野修炼-技术周刊第137期 | 编程已经面目全非
前端·github·ai编程