React router 跳转有几种方法

发布网友 发布时间:2022-04-23 22:42

我来回答

2个回答

懂视网 时间:2022-05-14 17:18

本篇文章给大家带来的内容是关于React组件卸载、路由跳转以及页面关闭(刷新)之前进行提示的实现方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

React组件卸载生命周期、路由跳转和页面关闭三者看起来有些类似的地方,比如都是当前组件即将从视口消失,但实际上所触发的事件均不相同。以一个实际案例出发:

某单页应用的文章编辑页用户正在编辑文章,此时尚未保存。

当用户不小心要跳转到另外一个路由时需要提醒用户是否继续跳转,这个过程需要触发路由跳转以及组件卸载;

而用户不小心点了关闭标签页按钮,或刷新了页面。这个过程触发了页面卸载事件;

在这个案例中我们需要实现:

1. 用户跳转页面时弹出提示框(路由采用histroy模式)

2. 用户关闭页面时弹出提示框

componentWillUnmount

首先这个钩子函数是在组件卸载前调用的一个函数,它并不能阻止当前组件的卸载。所以不要想方设法在这里做提示,因为即便提示了,组件还是会卸载,文章还是会消失。

路由守卫-<Prompt/>

为了实现第一个功能,需要一个跳转路由之前进行的判断。在react-router-dom 4.0 之后取消了先前的路由守卫(其实我没研究过之前版本的,这个描述摘自网络)。在react-router-dom 4.0之后,实现这个功能可以依靠<Prompt/>组件。文档链接↗

把这个组件添加到你的文章编辑页组件的任意部分

import {Prompt} from 'react-router-dom';
const Editor=()=>{
 return (
 <div>
  <Prompt
  when={true}
  message={location => '文章要保存吼,确定离开吗?'}
  />
 </div>
 )
}

这里有一点需要注意,使用<Prompt/>时,你的路由跳转必须通过<Link/>实现,而不能依靠<a/>原生标签。
点击取消时就会留在当前页面。至此已经实现了路由跳转时提醒用户进行保存的功能。

窗口关闭事件-beforeunload

实现第二个功能需要依靠对窗口的监听。React应用中对于窗口事件的应用远没有DOM事件频繁,所以好久没碰到还是有点手生的。最关键的就是,应该在何时进行监听?

应该在组件挂载时监听事件,组件卸载时移除事件监听。因为我已经开始全面采用hooks新特性了,所以这里使用到useEffect。

import React,{useEffect} from 'react';

const Editor=()=>{

 //监听窗口事件
 useEffect(() => {
 const listener = ev => {
  ev.preventDefault();
  ev.returnValue='文章要保存吼,确定离开吗?';
 };
 window.addEventListener('beforeunload', listener);
 return () => {
  window.removeEventListener('beforeunload', listener)
 }
 }, []);
 
//return ...
}

这里有几个需要注意的地方:

1、useEffect第二个参数为空数组,表示只调用了componentDidMount和componentWillUnmount两个钩子

2、事件监听和移除的第二个参数为同一个事件处理函数

3、在beforeunload事件中的confirm,prompt,alert会被忽略。取而代之的是一个浏览器内置的对话框。(参考:MDN|beforeunload)

4、必须要有returnValue且为非空字符串,但是在某些浏览器中这个值并不会作为弹窗信

热心网友 时间:2022-05-14 14:26

react实现路由可以直接使用react-router。ReactRouter是由Ryan Florence开发的应用于ReactJS的路由组件,它通过定义ReactJS组件<Routes>及相关子组件来实现页面路由的映射、参数的解析和传递。以下是例子:var ReactRouter = require('react-router'); var Routes = ReactRouter.Routes; var Route = ReactRouter.Route;//定义整个页面的路由结构var routes = ( <Routes location="hash"><Route path="/" handler={App}><Route path="books" name="bookList" handler={Books}/><Route path="movies" name="movieList" handler={Movies}/></Route></Routes>);

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com