React返回上一个页面,会重新挂载吗

ReactJS入门项目:构建hello-world应用 本文还有配套的精品资源,点击获取 简介:ReactJS是一个由Facebook开发的前端框架,专注于构建用户界面和单页面应用。本项目将深入探讨ReactJS的基本概念,通过创建一个简单的“Hello, World”应用来展示如何设置和运行React程序。核心主题包括组件化理念、JSX语法、状态管理和事件处理等。本学习路径还包括对现代JavaScript特性的掌握以及如何使用... 阅读详情
AI摘要

在 React 里,使用 React Router 或导航方法返回上一页面时,默认组件会重新挂载。文章介绍了避免组件重新挂载的方法,如用 React Router 的嵌套路由、缓存页面状态、使用 useMemo 或 useRef、借助 React Query 缓存数据,还提及 useLocation 状态传递和 keep - alive 插件。

在 React 中,当你使用 React Router 或其他导航方法返回到上一个页面时,默认情况下,返回的页面会重新挂载。也就是说,组件会重新执行它的生命周期方法(或钩子函数),例如 useEffect、useState 的初始状态设定等。

1、默认情况下组件会重新挂载

使用 useNavigate 或者浏览器的返回按钮时,返回到之前的页面会触发该页面组件的重新挂载。通常来说,页面会重新加载,并且该组件的 useEffect(如果设置了依赖项为 [])会再次执行。

import React, { useEffect } from 'react';

const PreviousPage = () => {
  useEffect(() => {
    console.log('Component mounted');
  }, []);

  return <div>Previous Page</div>;
};

当你从这个页面导航到其他页面再返回时,console.log(‘Component mounted’) 会再次打印,因为组件重新挂载了。

2、如何避免组件重新挂载

如果你想避免组件重新挂载(比如保持表单数据、滚动位置等),可以通过以下几种方法来实现页面的缓存或状态的持久化。

import { Outlet } from 'react-router-dom';

const Layout = () => {
  return (
    <div>
      <header>Header</header>
      <Outlet /> {/* 这里放置的子组件会根据路由切换,而 Layout 不会重新挂载 */}
    </div>
  );
};

2.1、使用 React Router 的 或嵌套路由

在 React Router v6 中,如果你将组件放在 Layout 组件或使用嵌套路由时,返回页面时可以避免某些组件的重新挂载(通常是保持页面布局组件)。

import { Outlet } from 'react-router-dom';

const Layout = () => {
  return (
    <div>
      <header>Header</header>
      <Outlet /> {/* 这里放置的子组件会根据路由切换,而 Layout 不会重新挂载 */}
    </div>
  );
};

这样,Layout 组件在页面切换时不会重新挂载,只会替换 Outlet 中的内容,允许你保持一些全局布局或共享状态。

2.2、缓存页面状态

使用状态管理工具(如 Redux、Context API),或者将状态保存在 localStorage 或 sessionStorage 中,可以在返回页面时恢复状态。

import React, { useState, useEffect } from 'react';

const FormPage = () => {
  const [inputValue, setInputValue] = useState(() => {
    // 从 localStorage 恢复初始值
    return localStorage.getItem('formInput') || '';
  });

  // 当 inputValue 改变时,保存到 localStorage
  useEffect(() => {
    localStorage.setItem('formInput', inputValue);
  }, [inputValue]);

  return (
    <div>
      <input
        type="text"
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
      />
    </div>
  );
};

export default FormPage;

2.3、 使用 React 的 useMemo 或 useRef

如果组件中的某些部分需要在重新挂载时保持不变,可以使用 useMemo 或 useRef 来缓存那些不需要每次重新计算的数据。

  • useMemo:用来记住计算结果,直到依赖项发生变化。
  • useRef:用于存储跨渲染周期保持不变的值。
const ExpensiveComponent = () => {
  const memoizedValue = useMemo(() => {
    return performExpensiveCalculation();
  }, []);

  return <div>{memoizedValue}</div>;
};

2.4、使用 React Query 等工具缓存数据

React Query 等库可以帮助你缓存请求数据。当你返回到一个页面时,它不会重新发起网络请求,而是使用缓存的数据来重新渲染页面。

3、 React Router 提供的 useLocation 的状态传递

如果你使用 React Router 的 navigate 时传递状态,你可以在返回页面时通过 useLocation 恢复状态,而不是让组件重新计算或重新挂载。

import { useNavigate, useLocation } from 'react-router-dom';

const PageComponent = () => {
  const location = useLocation();
  const navigate = useNavigate();

  useEffect(() => {
    if (location.state) {
      console.log('Restored state:', location.state);
    }
  }, [location.state]);

  return <div>Some content</div>;
};

4、使用 React Router 的 keep-alive 插件

React Router 没有内置的“缓存页面”功能,但你可以使用第三方插件,比如 react-activation,实现页面的“保活”功能,即保持页面状态不变而不重新挂载。

5、总结

  • 1、默认情况下,返回到之前的页面会重新挂载组件,即重新执行组件的生命周期或钩子函数。
  • 2、避免组件重新挂载的方法:
    使用 React Router 的嵌套路由或布局组件。
    通过 localStorage 或 sessionStorage 缓存状态。
    使用 useMemo、useRef 缓存部分计算结果。
    使用 React Query 等工具缓存数据。
    使用 react-activation 等插件保持页面不重新挂载。
西门子S7-1500 PLC模块化编程与生产线自动化实践 PLC(可编程逻辑控制器)作为工业自动化核心设备,其模块化编程技术能显著提升产线控制系统的开发效率。通过SCL高级语言实现算法封装、功能块(FB)复用等工程实践,可构建稳定可靠的分层式控制架构。本文以西门子TIA Portal平台为例,详解S7-1500系列PLC在汽车零部件产线中的标准化应用方案,包含配方管理、设备联动等典型场景的SCL实现,以及Profinet通信、虚拟轴同步等进阶技巧。特别适用于需要快速实施中大型生产线自动化改造的工程师,提供经过验证的异常处理机制和模块化设计规范。 阅读详情

相关推荐

RK3588与银河麒麟V10 SP1 2403深度适配:国产化硬件与操作系统的完美融合

本文深入探讨了RK3588处理器与银河麒麟V10 SP1 2403操作系统的深度适配,展示了国产化硬件与操作系统的完美融合。通过性能验证和实际应用测试,证明了这套组合在多媒体处理、AI推理和日常办公中的卓越表现,实现了完全自主可控的计算平台。

weixin_29194255的博客 249

react 页面跳转(下一页,返回上一页)

react 页面跳转 1.使用useHistory跳转 import { useHistory } from 'react-router-dom' const history = useHistory() const goPage = () => { history.push('/路由') } 2.返回上一页 // 如果使用hashHistory,哈希路由,路由上会加上# import creatHistory from 'history/createHashHistory' // 如果使用

jojo1001的博客 1万+

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro...

m0_46523403的博客 6418

react 回退至上一页并刷新数据

网上有搜索出来大部分都是用useHistory,由于个人不太想回退react-router-dom(6.16.0)的版本。因此尝试除了useHistory之外的一些方法。

qq_56905650的博客 3684

【人工智能】人工智能基础概念、流派、发展史

人工智能初衷就是让计算机能够像人类一样具有自我思考、自我学习、自我决策的能力。依据百度百科上对人工智能定义:人工智能是研究、开发用于模拟、扩展和延伸人的智能的理论、方法、技术及应用系统的一门新的技术学科。人工智能是研究使计算机来模拟人的某些思维过程和智能行为的学科,主要包括计算机实现智能的原理、制造类似于人脑智能的计算机,使计算机能实现更高层次的应用。

WEL测试 1882

告别手动查文献!用Claude Haiku 4.5一键帮你检索+插入参考文献,科研效率直接翻倍(附实操演示+AI提示词)

以下是我的论文段落内容与参考文献列表。以下是我论文段落内容【粘贴论文段落】,请根据每个段落的主题自动检索近五年内的高相关学术文献(以真实DOI或可查询来源为准),要求:1)为每个段落匹配2–3条最相关的文献;另一种是你没有现成的文献列表,需要AI能够帮你检索,筛选输出合适的参考文献列表,并将其正确插入至段落中。选择完成后,先让它检索文献,我设计了一段AI提示词,让Haiku 4.5模型围绕研究主题,给我在各大数据库搜索近五年的文献,并以表格的形式输出文献的核心信息,确保DOI号能直接跳转到原文。

qq_64378896的博客 407

React返回上个页面

一个小问题,记录一下。正常页面跳转使用的是react-router,但是总有一些情况需要使用一些别的跳转方式。 我使用的跳转页面方式是下面这种。 this.props.history.push('/admin/user/info/' + userId) 同样返回上一级也可以使用上面的代码,但是当从不同的地方进入到这个页面时,返回的时候只想返回到跳转页面之前的页面那该怎么写呢?so...

李公子的博客 8538

EPLAN 电气制图(六):结构盒与设备管理器核心概念(基础知识选看)

结构盒是 EPLAN 中用于标识元件安装位置的逻辑容器,非实际设备或黑盒,仅用于原理图中划分功能区域或物理位置(如 “柜内”“柜外”)。标识符设置:在 “显示设备标识符” 中输入位置代号(如 “+ 柜外”),完整格式为 “= 高层代号 + 位置代号”;筛选与定位:通过 “筛选器” 按类别(如电机、接触器)快速查找设备,右键 “转到(图形)” 可高亮定位图纸中的元件;设备保护:重要设备可启用保护(【项目数据】→【设备】→【启用设备保护】),防止误删除(显示橙色圆圈标记)。

电工 1057

React返回上一页,前两页方法

react返回上一页,react返回前两页方法。包括class组件和hook组件的用法

qd1014751893的博客 1082

FLUENT Meshing Watertight Geometry工作流入门 - 4 局部加密区域

总结一下本课程中学到的内容:我们了解了如何使用模型中特定兴趣区域的BOI和FOI局部尺寸控制来加密网格。然后,了解了如何使用Box类型的局部细化区域。最后,学习了Ansys Fluent Meshing Watertight Geometry Workflow的Offset Surface类型创建局部细化区域任务。

B_etter_Man的博客 6640

WorkBuddy KiCad 实战:国产 AI 搭子不只会写代码,传感器板从零走到可审查

真正可用的 PCB 教程不能承诺“一键打样”。本课把 WorkBuddy 放在需求拆分、文件生成和审查记录的位置,KiCad 负责 ERC、DRC 与制造文件,工程师负责最终判断。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、KiCad 8.0、Python 3.11 与人工审阅组成一条可复现链路。你会从“已确认的接口表、器件库来源、板框与电源方案”出发,得到“KiCad 工程、原理图、初始 BOM、ERC 报告与审查记录”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶

yueyeguzhuo的专栏 213

React 使用react-router-dom 中的嵌套路由实现详情页回退列表页不刷新效果

React 使用react-router-dom 中的嵌套路由实现详情页回退列表页不刷新效果。

HShuai_的博客 2129

Java零基础之多线程篇:线程间如何通信?

随着计算机技术的发展,多线程编程已经成为现代软件开发中的一个重要方向。在多线程编程中,线程间的通信是一个非常关键的问题。在Java开发语言中,Java提供了一些机制来实现线程间的通信,帮助开发者协调不同线程之间的执行顺序和数据交换。本文将介绍Java多线程编程中的线程间通信的相关知识。首先,我们将从简介开始,介绍线程间通信的基本概念和原理。然后,我们将通过源代码解析的方式,深入探讨Java中实现线程间通信的方法。接着,我们将给出一些应用场景案例,展示线程间通信在实际开发中的应用。

喵手的博客 1558

createBottomTabNavigator 的子页面,路由切换时,更新数据

RN使用 createBottomTabNavigator 创建底部导航栏时,只会在第一次创建时调用 componentDidMount 钩子, 当跳转到另一个页面,点击返回键再次返回到此页面时不会再次调用,但我们往往需要在返回此页面后重新执行获取数据等方法函数。 解决方法 子页面: componentDidMount() { this._navListener = this.props...

鹿的迷雾林的博客 2761

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

React——强制重新挂载组件

访问相同路由时候,只会触发render,组件没有重新挂载,这种情况对需要刷新数据的项目来说是不ok的要强制重新挂载组件,可以尝试这个方法:访问一个空路由再返回来...

Astar的博客 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

React 中的“重新渲染”和“组件初次挂载”的区别

初次挂载:当组件第一次被渲染到页面上时(如打开一个包含这个组件的页面),会触发useEffect中的 API 调用。重新渲染:当组件的状态或属性发生变化时,组件会重新渲染,但由于useEffect依赖数组为空,API 不会再次被调用。通过在useEffect中调用 API 并传入空依赖数组,确保 API 调用只在组件初次挂载时执行一次,从而避免不必要的重复请求。

十步杀一人-千里不留行 680

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

React的生命周期 和 页面优化

React的生命周期 和 页面优化 先上React的生命周期图 页面优化问题在 shouldComponentUpdate 函数那里写的(有颜色备注) React声明周期的四个大阶段: Initialization:初始化阶段。 Mounting: 挂在阶段。 Updation: 更新阶段。 Unmounting: 销毁阶段。 什么是生命周期函数 用大神 技术胖 来说就是 生命周期函数指在...

weixin_40719714的博客 1587

React 中的重新渲染

React 组件在组件的状态 state 或者组件的属性 props 改变的时候,会重新渲染,条件简单,但是实际上稍不注意,会引起灾难性的重新渲染......

qq_32198115的博客 4660

React-Reparenting:轻松管理React组件的重新父级化

React-Reparenting:轻松管理React组件的重新父级化 在现代Web开发中,React已经成为构建用户界面的首选框架之一。然而,随着应用复杂性的增加,开发者们常常面临一些棘手的问题,比如如何在不重新挂载组件的情况下,将一个子组件从一个父组件转移到另一个父组件。这就是React-Reparenting项目诞生的背景。 项目介绍 React-Reparenting是一个简单、直观且可配...

gitblog_00123的博客 788

react-dnd 回归示例解析:drag-source-rerender 中拖拽源在重渲染与卸载后重新挂载场景下的行为验证

本文围绕 react-dnd 仓库中的回归示例 `drag-source-rerender` 展开,该示例用于验证一个特定场景:**拖拽源(Drag Source)在父组件重渲染、被卸载(隐藏)后重新挂载(显示)时,其拖拽能力与内部状态是否仍然正确**。示例表面是一个"拖拽盒子 → 隐藏 → 再次显示 → 再次拖拽"的手动测试用例,背后却对应着 react-dnd 的 `useDrag` Hook

gitblog_01081的博客 929

React实现页面定时刷新

如果你使用了类似`window.location.reload()`这样的方法来强制页面重新加载,那么无论是否使用了`count`状态变量,页面都会被重新加载。在这个例子中,我们使用了`useEffect`钩子来在组件挂载时启动一个定时器,在5秒钟后调用`window.location.reload()`方法,强制浏览器重新加载页面。只有在使用`count`的代码中,当`count`更新时,React会重新渲染组件并更新DOM,从而导致页面重新渲染。因此,应该谨慎地使用此方法,并在确保必要时才使用它。

liweiweili126的博客 3245

React.js挂载阶段的组件生命周期

组件的挂载指的是将组件渲染并且构造 DOM 元素然后插入页面的过程。这是一个从无到有的过程,React.js 提供一些生命周期函数可以给我们在这个过程中做一些操作。 React.js 将组件渲染,并且构造 DOM 元素然后塞入页面的过程称为组件的挂载。这一节我们学习了 React.js 控制组件在页面上挂载和删除过程里面几个方法: componentWillMount:组件挂载开始之前,也就...

Homer_Simpson的博客 3180

React Router 路由变化时如何重新渲染同一个组件:深度解析与最佳实践

React Router 路由变化时如何重新渲染同一个组件:深度解析与最佳实践

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1053

React组件树遍历终极指南:深入Under-the-hood-ReactJS架构解析

Under-the-hood-ReactJS是一个通过可视化流程图详细解析React源码架构的开源项目,它以Stack版本和Fiber版本两种方式,帮助开发者理解React组件树的构建与遍历机制。本文将带你深入探索React组件树遍历的核心原理,从挂载到更新的完整流程,让你彻底掌握React底层工作机制。 ## 一、React组件树遍历基础:从虚拟DOM到真实渲染 React的高效渲染核心在于

gitblog_00852的博客 471

react 回退到前一页面对应位置

由于react的在跳转页面的时候,实际做了unmount的动作,清楚了前一页面的内容,返回的时候实际上是需要重新渲染的,相应的跳转位置就会丢失。我再做项目开发的过程中也遇到了相同的问题,我把我解决的过程分享给大家,希望能够帮到你。 解决问题的技术背景 1.我们的app是使用了上啦加载下啦刷新的插件(自己封装的),采用的是固定的高度(屏幕高度),自定义滚动轴(非浏览器滚动轴),这个插件会实...

wujun123456wujun的博客 3555

React DnD 回归测试深度解析:Drag Source 重挂载(Remount)后如何确保拿到正确 Props

本篇技术指南围绕 React DnD 仓库中的回归示例 "Drag Source Remounts with Correct Props"(对应 [关联文档](https://link.gitcode.com/i/3701564733c1af341057ee43eb2fd943))展开,该示例用于验证一个关键行为:当拖拽源组件在拖拽过程中被卸载并重新挂载时,React DnD 会为新的组件实例重新

gitblog_00114的博客 918
上一篇: React 生命周期 - useEffect 介绍
下一篇: React -AppVarContext.Provider 提供者组件
黄毛火烧雪下
黄毛火烧雪下 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄14年 7714粉丝 439原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

黄毛火烧雪下

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

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

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

打赏作者

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

抵扣说明:

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

余额充值