reactrouter监听路由变化_ReactRouter入门到实践

React-Router入门与实践

88c2ca07c27328674624f637c8c02207.png b9a817796975ec47e547eb94c5d28c0f.png

React Router 保持 UI 与 URL 同步,是完整的 React 路由解决方案。在下面的例子中采用react-router-dom V5版本在浏览器中演示。

9f403a5cf136b4f669bf937fb835c480.png

什么是路由 ?

在web开发中,我们经常会遇到“路由”这个名词。简单来说,路由就是URL到处理程序的映射 - 我们的应用程序根据URL地址来作出对应的响应。本质就是监听URL的变化,显示相应的页面。

9b09b0489652f2f7d9fe8502c43478ef.png

理解React-router中的名词

“ Router ” 

一个容器, 里面包含了各种由Route定义的路由。

“ Route ”

定义一条路由(也可以称作线路),将一个URL路径和一个处理函数(此处为React组件)对应。

“ Switch ”

路由唯一匹配,它只会渲染第一个和URL匹配的元素,如果不加Switch,则会依次渲染与URL匹配的Route。

“ Redirect ”

路由自动跳转。

“ Link ”

React版本的元素, 表示路由链接。

b6c811a3ff1ed71d03022580c332b210.png

入门案例实践

我们可以用create-react-app生成一个项目,安装react-router-dom依赖后新建路由配置文件Routes:

12a6f2b88a16178cc9e29efec9af8533.png

然后App.js 中直接返回路由组件(路由组件已挂载至根组件,根据浏览器地址显示相应的组件):

17a38225b1b0f16e25fe2c7a2cc023ca.png

其实到这步一个最简单的路由已经完成了。

注:  Route中的path参数匹配URL地址,页面交给传入component的组件去渲染,exact表示你希望路径完全匹配时才渲染组件。"/user/:id"表示带动态参数的路由,可以匹配到 "/user/mia"或"/user/json" 等。如果都没匹配到,则渲染NoMatch组件。

1e4f2aac052abf86119a5456a0650bb5.png

对于页面中的组件需要跳转,我们可以使用Link标签或者使用useHistory api去跳转:

69d15e5f4d42969b219616fe95579cf4.png 9255b5b913b7a48bf37615db6be637a4.png

进阶 - 路由守卫 (路由鉴权)

如何验证用户是否拥有访问页面即组件的权限,我们有时候希望去守护我们的路由,让没有权限的用户不能进入,在Github issue上就这个问题有过讨论:

You can do this from within your render function. JSX doesn't need an API for this because it's more flexible.

因为JSX很灵活,所以不需要API,我们所做的只需在渲染中去添加我们自己的逻辑,编写我们自己的鉴权逻辑函数如下,:

df2c3076d89b68c3317a05fe7999937e.png

我们拿到后端返回的角色权限通过上述路由鉴权函数去做路由权限校验,如果当前角色属于路由授权权限中,则放行,否则不通过:

ab8b37c3df6a2af03ae2050ae6bb72c1.png

最后把Routes里面的Route组件换成我们的守卫组件RouterGuard即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Router提供了一种使用`<Route>`组件的方法来监听变化。可以使用`componentDidUpdate`方法来检测变化,从而执行相应的操作。 以下是一个例子,展示如何在React Router中监听变化: ```javascript import React from 'react'; import { Route } from 'react-router-dom'; class App extends React.Component { componentDidUpdate(prevProps) { if (this.props.location !== prevProps.location) { // 由已经变化 console.log('变化'); } } render() { return ( <div> <Route exact path="/" component={Home} /> <Route path="/about" component={About} /> <Route path="/contact" component={Contact} /> </div> ); } } ``` 如果想要监听`history.push/replaceState`,可以通过重写这些方法来实现: ```javascript const originalPush = history.push; history.push = function push(pathname, state) { originalPush.call(this, pathname, state); window.dispatchEvent(new Event('pushstate')); }; const originalReplace = history.replace; history.replace = function replace(pathname, state) { originalReplace.call(this, pathname, state); window.dispatchEvent(new Event('replacestate')); }; ``` 然后,可以通过监听`pushstate`和`replacestate`事件来检测状态的变化: ```javascript window.addEventListener('pushstate', function() { console.log('history.pushState 发生了变化'); }); window.addEventListener('replacestate', function() { console.log('history.replaceState 发生了变化'); }); ``` 如果想要监听`local/sessionStorage`的变化,可以使用`window.addEventListener`来监听相应事件: ```javascript window.addEventListener('storage', function(e) { if (e.key === 'mykey') { console.log('localStorage变化为:' + e.newValue); } }); ``` 同样的,可以使用`sessionStorage`来监听`sessionStorage`的变化

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值