You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中点击跳转页面后如何仅更新指定记录的输入框值?

解决React网格仅更新指定ID记录输入框值的问题

问题场景

React项目中,网格组件渲染包含文本、输入框等多种数据类型的数据集,其中某列映射为带默认值的输入框。需求为:点击某条记录跳转到新页面,点击该页面的返回按钮后,仅更新原网格中对应ID记录的输入框名称,但当前操作会修改所有记录的输入框值。

问题根源

当前通过全局Context存储的newValue是单一字符串,未与具体记录的ID关联,导致所有输入框都读取同一个全局值,触发全量更新。

解决方案

通过修改全局Context的存储结构,关联目标记录ID与更新值,实现精准更新:

1. 调整全局Context的存储结构

将原本单一的newValue改为存储包含目标ID和对应值的对象:

import { createContext, useState } from 'react';

const GlobalContext = createContext();

export const GlobalProvider = ({ children }) => {
  // 存储格式:{ targetId: 目标记录ID, value: 要更新的输入框值 }
  const [updateInfo, setUpdateInfo] = useState(null);

  return (
    <GlobalContext.Provider value={{ updateInfo, setUpdateInfo }}>
      {children}
    </GlobalContext.Provider>
  );
};

export default GlobalContext;

2. 修改Test页面的返回逻辑

点击返回按钮时,将目标ID和新值存入Context:

const Test = () => {
  const location = useLocation();
  const navigate = useNavigate();
  const newId = location.state?.id;
  const { setUpdateInfo } = useContext(GlobalContext);

  const handleClick = () => {
    // 保存要更新的记录ID和对应值
    setUpdateInfo({ targetId: newId, value: "John Spencer" });
    navigate("/");
  };

  return (
    <>
      <h2>Test Page</h2>
      <p>ID: {newId}</p>
      <button onClick={handleClick}>Go Back</button>
    </>
  );
};

3. 调整Grid组件的输入框渲染逻辑

仅当当前记录ID与Context中存储的目标ID匹配时,才替换输入框的默认值:

const Grid = (props) => {
  let colConfig = props.GridConfig.column_config;
  let gridData = props.GridData?.data;
  const { updateInfo } = useContext(GlobalContext);
  const navigate = useNavigate();

  return (
    // ...其他网格渲染代码
    {colConfig[cIndex].data_type === "input_text" &&
      !colConfig[cIndex].cell_click_callback && (
        <input
          type="text"
          defaultValue={
            // 判断当前记录ID是否匹配目标ID,再决定显示值
            updateInfo && updateInfo.targetId === rowData[0].id 
              ? updateInfo.value 
              : colData
          }
        />
      )}
    // ...其他网格渲染代码
  );
};

4. 可选优化:清空临时更新信息

回到首页后清空Context中的updateInfo,避免后续渲染时保留旧值:

// 在App组件中添加路由监听
import { useLocation } from 'react-router-dom';
import { useContext, useEffect } from 'react';
import GlobalContext from './GlobalContext';

function App() {
  const location = useLocation();
  const { setUpdateInfo } = useContext(GlobalContext);

  useEffect(() => {
    if (location.pathname === "/") {
      setUpdateInfo(null);
    }
  }, [location.pathname, setUpdateInfo]);

  // ...原有渲染代码
}

效果验证

完成上述修改后,点击返回按钮时,只有与目标ID匹配的记录输入框会更新为新值,其他记录保持原有默认值,实现了精准更新的需求。

内容的提问来源于stack exchange,提问作者Prakash Patil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:19:02