React路由 React-router-dom的使用

路由 react-router-dom

react的的插件库,专门做SPA应用
安装5版本的 npm install react-router-dom@5

路由的基本使用

1.明确好界面的导航区、展示区
2.导航区a标签改为Link标签
3.展示区写Route标签进行路径的匹配
4.在最外侧包裹一个<BrowserRouter></BrowserRouter> 或者 <HashRouter></HashRouter>
// 全局注册路由
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

import { Link, Route } from 'react-router-dom'
import About from "./components/About/index.jsx"
import Home from "./components/Home/index.jsx"
// 组件中编写路由器
{/* 原生html中靠a跳转不同的页面 */}
{/* <a className="list-group-item" href="./about.html">About</a>
<a className="list-group-item active" href="./home.html">Home</a> */}

{/* 在React中靠路由切换组件 --编写路由链接*/}
{/* 指定适用的Router的类型 BrowserRouter */}
<Link className="list-group-item" to="/about">About</Link>
<Link className="list-group-item" to="/home">Home</Link>

// 注册路由
{/* 注册路由 */}
<Route path="/about" component={About}></Route>
<Route path="/home" component={Home}></Route>

NavLink 的使用

import {NavLink} from 'react-router-dom'
// NavLink的使用
{/* 使用NavLink  点谁给谁加active类名  可以使用  activeClassName="active" 添加点击之后要添加的类名 */}
<NavLink className="list-group-item" to="/about">About</NavLink>
<NavLink className="list-group-item" to="/home">Home</NavLink>

Switch的使用

1.通常情况下,path和component是一一对应的关系
2.Switch可以提高路由匹配的效率(单一匹配)

{/* Switch 如果多个组件匹配同一个路由只匹配第一个 */}
<Switch>
  <Route path="/about" component={About}></Route>
   <Route path="/home" component={Home}></Route>
</Switch>

路由组件与一般组件

1.写法不同
2.存放位置不同
3.接收到的props不同
    一般组件传递什么接收什么
    路由组件:接收到3个固定的属性:location、history、match
    history:
        go: ƒ go(n)
        goBack: ƒ goBack()
        goForward: ƒ goForward()
        push: ƒ push(path, state)
        replace: ƒ replace(path, state)
    location:
        pathname: "/about"
        search: ""
        state: undefined
    match:
        params: {}
        path: "/about"
        url: "/about"

解决多级路径样式丢失的问题

1.public/index.html 中引入样式不写./ 写/(常用)
2.public/index.html 中引入样式不写 ./ 写%PUBLIC_URL% (常用)
3.使用 HasnRouter

路由的严格匹配和模糊匹配

1.严格匹配:路径必须完全匹配
2.模糊匹配:路径可以部分匹配
3.默认开启模糊匹配
// 开启严格匹配
<Route path="/home" excact={true} component={Home}></Route>

嵌套路由

1.嵌套路由的写法
2.嵌套路由的存放位置
3.嵌套路由的接收到的props不同
4.嵌套路由的严格匹配和模糊匹配
5.嵌套路由的默认开启模糊匹配
6. 注册子路由时要写上父路由的path
// 嵌套路由
<Route path="/home" exact={true} component={Home}>
  <Route path="/home/about" component={About}></Route>
</Route>

向路由组件中传递数据

1.params参数(常用)

// 向路由组件中传参
// 1.路由链接携带参数

{/* 向路由组件传递params参数 */}
<Link to={`/home/message/Detail/${item.id}`}>{item.title}</Link>&nbsp;&nbsp;

// 2.注册组件声明参数

/* 声明接收params参数 */}
<Route path="/home/message/Detail/:id" component={Detail} />

// 3. 在组件中接收参数
// 接收params参数
const {id} = this.props.match.params

2.传递search参数

{/* 向路由组件传递search参数 */}
<Link to={`/home/message/Detail/?id=${item.id}`}>{item.title}</Link>&nbsp;&nbsp;

{/* search参数无需声明接收 */}
<Route path="/home/message/Detail" component={Detail} />


// 接收search参数
import qs from 'qs'
const {search} = this.props.location
const {id} = qs.parse(search.slice(1))

// state参数



3.传递state参数


 {/* 向路由传递state参数 */}
<Link to={{pathname:"/home/message/Detail",state:{id:item.id}}}>{item.title}</Link>&nbsp;&nbsp;

{/* state参数无需声明接收 */}
<Route path="/home/message/Detail" component={Detail}/>


// // 接收state参数
const {id} = this.props.location.state

push 和 replace

push 进行压栈操作 记录每一条操作

replace 进行替换操作 不记录

{item.title}  

编程式路由导航


<!-- params -->
 this.props.history.push(`/home/message/Detail/${item.id}`)

 <!-- search -->
 this.props.history.push(`/home/message/Detail?id=${item.id}`)

 <!-- state -->
 this.props.history.push(`/home/message/Detail`,{id})

//  注册和接收和Link一样


//  回退
this.props.history.goBack()
// 前进
this.props.history.goForward()

// 前进/后退几步
this.props.history.go(1) //前进一步
this.props.history.go(-1) //后退一步


// 讲普通组件抛出成路由组件  让一般组件具备路由组件特有的api
import {withRouter} from 'react-router-dom'

export default withRouter(name)

BrowserRouter 和 HasnRouter的区别

1.底层原理不同
    BrowserRouter使用H5的history API 不兼容IE9以下的版本
    HashRouter的使用是URL的哈希值
2.path的表现形式不一样
    BrowserRouter的路径中没有#
    HashRouter的路径中包含#
3.刷新后对路由state参数的影响
    1.BrowserRouter没有任何影响
    2.HashRouter刷新后会导致路由state参数的丢失
4.备注:HashRouter可以用于解决一些路径错误相关的问题
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值