0

0

如何在 React 中跨页面安全传递数据(如表格行记录)

聖光之護

聖光之護

发布时间:2026-02-05 19:18:16

|

254人浏览过

|

来源于php中文网

原创

如何在 React 中跨页面安全传递数据(如表格行记录)

本文介绍使用 react router 与 context api 实现父子组件及跨路由页面间的数据传递,解决点击编辑按钮后 `row` 数据丢失的问题,确保 `editrecord` 页面能可靠获取原始记录。

在 React 应用中,当用户点击表格中的“编辑”按钮跳转到 /edit 页面时,若仅通过局部 useState 设置数据并立即导航(如 href 跳转),该状态将因组件卸载而丢失——这正是你遇到 record props 消失的根本原因。关键在于:状态需提升至路由级共享作用域,并配合声明式导航触发数据持久化。

✅ 正确做法:React Router + Context 管理跨页数据

1. 配置路由(App.js

import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import ParentComponent from './ParentComponent';
import EditRecord from './EditRecord';

function App() {
  return (
    
      
        
        
      
    
  );
}
export default App;

2. 创建全局数据上下文(RecordContext.js)

import React, { createContext, useState, useContext } from 'react';

const RecordContext = createContext();

export const RecordProvider = ({ children }) => {
  const [record, setRecord] = useState({});

  return (
    
      {children}
    
  );
};

export const useRecord = () => {
  const context = useContext(RecordContext);
  if (!context) throw new Error('useRecord must be used within RecordProvider');
  return context;
};

3. 包裹根组件(index.js 或 Root.js)

import React from 'react';
import ReactDOM from 'react-dom/client';
import { RecordProvider } from './RecordContext';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  
    
  
);

4. 父组件:点击时存数据 + 编程式导航(ParentComponent.js)

⚠️ 重要修正:移除 和内联 setRecord,改用 useHistory(v5)或 useNavigate(v6)

ClipSketch AI
ClipSketch AI

将视频瞬间转化为手绘故事

下载
import React from 'react';
import { useNavigate } from 'react-router-dom'; // v6 写法(推荐)
import { useRecord } from './RecordContext';

const ParentComponent = ({ data }) => {
  const navigate = useNavigate();
  const { setRecord } = useRecord();

  const handleEdit = (row) => {
    setRecord(row); // ✅ 存入全局上下文
    navigate('/edit'); // ✅ 编程式导航,不触发页面刷新
  };

  return (
    
      {data.map((row, index) => (
        
          
            
          
        
      ))}
    
  );
};

export default ParentComponent;

5. 子页面:从上下文读取数据(EditRecord.js)

import React from 'react';
import { useRecord } from './RecordContext';

const EditRecord = () => {
  const { record } = useRecord();

  // ✅ 此处 record 始终为最新选中的行数据
  if (!Object.keys(record).length) {
    return 
未选择要编辑的记录,请返回列表页
; } return (

编辑记录

{JSON.stringify(record, null, 2)}
{/* 此处可接入表单、API 提交等逻辑 */} ); }; export default EditRecord;

⚠️ 注意事项与替代方案

  • 不要用 href 跳转 + useState 是硬跳转,会销毁当前组件实例,本地状态必然丢失。
  • 避免 URL 参数传复杂对象:?id=123 适合简单 ID,但 row 若含嵌套结构或二进制数据,应走状态管理而非序列化到 URL。
  • 进阶场景建议
    • 数据量大或需服务端同步 → 使用 Redux Toolkit 或 Zustand;
    • 多级嵌套路由 → 结合 useParams + 后端查询,而非前端传整个对象;
    • 需持久化(刷新不丢)→ 在 setRecord 时同步写入 sessionStorage。

通过 Context + Router 的组合,你构建了一个轻量、可维护、符合 React 思想的跨页数据流,既规避了 prop-drilling,又保证了状态生命周期与路由一致。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

516

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

307

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

381

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5447

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

483

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

239

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

269

2023.09.21

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

7

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.7万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号