在React中使用react-router-dom路由

在React中使用react-router-dom路由

前言

使用React构建的单页面应用,要想实现页面间的跳转,首先想到的就是使用路由。在React中,常用的有两个包可以实现这个需求,那就是react-router和react-router-dom。本文主要针对react-router-dom进行说明。

一、安装react-router-dom

首先进入项目目录,使用npm安装react-router-dom:

npm install react-router-dom --save-dev //这里可以使用cnpm代替npm命令

//说明: -save-dev 的意思是将模块安装到项目目录下,并在package文件的devDependencies节点写入依赖。

//总结--save-dev和-save的区别如下:
//devDependencies 节点下的模块是我们在开发时需要用的,比如项目中使用的 gulp ,压缩css、js的模块。这些模块在我们的项目部署后是不需要的,所以我们可以使用 -save-dev 的形式安装。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下,所以我们应该使用 -save 的形式安装。
import React, { Component } from 'react'
import './index.css'
import {
    Route,
    Switch,
    Link,
    Redirect,
    NavLink,
    BrowserRouter as Router
} from 'react-router-dom'
   //定义了一个Home.js组件
class Home extends Component{
    render(){
       return (
        <Router>
           <div>
               <ul>  <!--<NavLink><Link>的一个特定版本,会在匹配上当前的url的时候给已经渲染的元素添加参数,比如本例中当我们点击下面这个“food”时,这个“food”字符串就会变成高亮的样式突出显示-->
                   <NavLink to="/food" activeClassName="active">food</NavLink><hr/>
                   <NavLink to="/wiki" activeClassName="active">wiki</NavLink><hr/>
                   <NavLink to="/profile" activeClassName="active">profile</NavLink><hr/>
               </ul>
               /* 使用Switch是为了将React默认的包容性路由变为排他性路由 */
               /* 包容性路由:/food 既能匹配到/ 又能匹配到/food   
                   排他性路由:只能匹配一个 /food就只能匹配到/food */
                   <Switch>
                      /*Redirect 是路由的重定向  即匹配到某一个路由转化到另一个路由  */
                       <Redirect from="/" exact to="/food"/>
                       <Route path="/food" component={Food}/>
                         /* 除了用Switch外也可以用exact来避免一个路由匹配多个,exact是精准匹配
                            但是使用exact时需要每个路由上都加上exact才能达到和Switch一样的效果 */
                        /* <Route path="/wiki" exact component={Wiki}/> */
                       <Route path="/wiki" component={Wiki}/>
                       <Route path="/profile" component={Profile}/>
                       <Route component={Page404}/>  //如果前面写的Route都不匹配,那就走这个Route
                   </Switch>
           </div>
        </Router>
       )
    }
}
//定义路由使用的组件
//这是定义组件的另一种写法
    //在Food中定义子路由
const Food = () => (
    <div>
        <Link to="/food/foodlist/3">foodlist</Link><br/>
        <Link to="/food/foodmenu">foodmenu</Link>
        <Route path="/food/foodlist/:id" component = {Foodlist}></Route>
        <Route path="/food/foodmenu" component = {Foodmenu}></Route>
    </div>
  )

  //这是定义组件的另一种写法
 const Wiki = () => (
    <div>Wiki</div>
  )
//这是定义组件的另一种写法
 const Profile = () => (
    <div>profile</div>
  )
//这是定义组件的另一种写法
  const Page404 = () => (
    <div>page not found.</div>
  )

  //定义路由使用的组件结束


  //子路由调用的组件
  const Foodlist = () => (
    <div>子路由的Foodlist</div>
  )
  const Foodmenu = () => (
    <div>子路由的Foodmenu</div>
  )

export default Home

特别注意:/index.css是我引入的一个高亮的样式

img

index.css里面的代码

.active {
    font-size: 50px;
  }

运行结果如下 :讲解:其实我们在开始的时候在浏览器地址栏里面输入的是localhost:3000,但是我们Home.js里

的代码里面有

<Redirect from="/" exact to="/food"/>

所以直接重定向访问localhost:3000/food,执行

 <NavLink to="/food" activeClassName="active">food</NavLink><hr/>

从而下图里面的food是高亮状态(说明:这个高亮的样式是我们在NavLink里面写的),最下面还显示出foodlist和foodmenu

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java全栈研发大联盟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值