新闻中心

React 组件参数未更新导致数据未刷新问题的解决方案

2025-10-08
浏览次数:
返回列表

react 组件参数未更新导致数据未刷新问题的解决方案

本文旨在解决 React 应用中,父组件向子组件传递参数后,子组件未能根据新的参数值及时更新数据的问题。通过分析问题代码,我们将定位到表单提交导致的页面刷新是罪魁祸首,并提供使用 e.preventDefault() 阻止默认行为的解决方案,确保组件能够正确响应参数变化并刷新数据。

在 React 应用开发中,父子组件之间的数据传递是常见的模式。然而,有时我们可能会遇到这样的问题:父组件传递给子组件的参数发生了变化,但子组件并没有根据新的参数值重新渲染或获取数据。这会导致 UI 显示的数据与预期不符,影响用户体验。

下面我们通过一个实际案例来分析这个问题,并提供解决方案。

问题描述

一个应用包含一个搜索栏(N*bar)和一个数据表格(AttacksGrid)。用户在搜索栏中输入关键词,点击搜索按钮后,关键词会被传递给 AttacksGrid 组件,AttacksGrid 组件会根据关键词从后端获取数据并显示在表格中。

然而,实际情况是,每次点击搜索按钮后,AttacksGrid 组件都会显示空数据,或者显示初始状态的数据,并没有根据新的关键词进行数据刷新。

代码分析

以下是相关组件的代码:

App 组件:

function App() {
  const [query, setQuery] = useState("");

  const searchClicked = (keyword) => {
    console.log(`setting query to: ${keyword}`);
    setQuery(keyword); // for now we want to search for the keyword in the name and description, platform is not supported yet
  };

  return (
    <div>
      <N*bar onSearchClicked={searchClicked} />
      <AttacksGrid query={query} />;
    </div>
  );
}

AttacksGrid 组件:

function AttacksGrid({ query }) {
  console.log(`QUERY IS ${query}`);
  useEffect(() => {
    fetch(`http://127.0.0.1:9000/attacks?name=${query}&description=${query}`)
      .then((response) => response.json())
      .then((data) => {
        console.log(data);
        setAttacks(data);
      })
      .catch((err) => console.log(err));
  }, [query]);

  const [attacks, setAttacks] = useState([]);

  return (
    <>
      <table className="table table-dark">
        <thead>
          <tr>
            <th scope="col">Name</th>
            <th scope="col">Description</th>
            <th scope="col">Platforms</th>
            <th scope="col">Detection</th>
            <th scope="col">Phase</th>
          </tr>
        </thead>

        {attacks.map((attack) => (
          <tbody key={attack.ID}>
            <tr>
              <th scope="row">{attack.NAME}</th>
              <td>{attack.DESCRIPTION}</td>
              <td>{attack.X_MITRE_PLATFORMS}</td>
              <td>{attack.X_MITRE_DETECTION}</td>
              <td>{attack.PHASE_NAME}</td>
            </tr>
          </tbody>
        ))}
      </table>
    </>
  );
}

N*bar 组件:

AI Surge Cloud AI Surge Cloud

低代码数据分析平台,帮助企业快速交付深度数据

AI Surge Cloud 87 查看详情 AI Surge Cloud
function N*bar({ onSearchClicked }) {
  const [message, setMessage] = useState("");
  const handleChange = (event) => {
    setMessage(event.target.value);
    console.log(message);
  };
  return (
    <n* className="n*bar bg-body-tertiary">
      <div className="container-fluid">
        <form className="d-flex" role="search">
          <input
            id="message"
            name="message"
            className="form-control me-2"
            type="search"
            placeholder="Search"
            aria-label="Search"
            onChange={handleChange}
          />
          <button
            className="btn btn-outline-success"
            type="submit"
            onClick={() => {
              onSearchClicked(message);
            }}
          >
            Search
          </button>
        </form>
      </div>
    </n*>
  );
}

通过观察代码,我们发现 AttacksGrid 组件的 useEffect 依赖于 query 变量,当 query 发生变化时,useEffect 应该重新执行,从而从后端获取新的数据。

问题出在 N*bar 组件中的表单提交。当点击搜索按钮时,由于 button 的 type 属性为 submit,表单会默认提交,导致页面刷新。页面刷新后,App 组件的状态会被重置,query 重新变为空字符串,因此 AttacksGrid 组件总是显示初始状态的数据。

解决方案

要解决这个问题,我们需要阻止表单的默认提交行为。可以使用 e.preventDefault() 方法来实现。

修改 N*bar 组件中的 button 的 onClick 事件处理函数:

<button
  className="btn btn-outline-success"
  type="submit"
  onClick={(e) => {
   e.preventDefault(); //Preventing default page refresh submit form action
   onSearchClicked(message);
  }}
>
  Search
</button>

通过在 onClick 事件处理函数中调用 e.preventDefault(),我们可以阻止表单的默认提交行为,从而避免页面刷新。

完整代码

以下是修改后的 N*bar 组件的完整代码:

function N*bar({ onSearchClicked }) {
  const [message, setMessage] = useState("");
  const handleChange = (event) => {
    setMessage(event.target.value);
    console.log(message);
  };
  return (
    <n* className="n*bar bg-body-tertiary">
      <div className="container-fluid">
        <form className="d-flex" role="search">
          <input
            id="message"
            name="message"
            className="form-control me-2"
            type="search"
            placeholder="Search"
            aria-label="Search"
            onChange={handleChange}
          />
          <button
            className="btn btn-outline-success"
            type="submit"
            onClick={(e) => {
              e.preventDefault(); //Preventing default page refresh submit form action
              onSearchClicked(message);
            }}
          >
            Search
          </button>
        </form>
      </div>
    </n*>
  );
}

总结

在 React 应用中,如果子组件未能根据父组件传递的参数及时更新数据,需要检查以下几点:

  1. 父组件是否正确地更新了状态。
  2. 子组件的 useEffect 是否正确地依赖于父组件传递的参数。
  3. 是否存在表单提交或其他导致页面刷新的操作。

通过使用 e.preventDefault() 阻止表单的默认提交行为,我们可以避免页面刷新,确保组件能够正确响应参数变化并刷新数据.

以上就是React 组件参数未更新导致数据未刷新问题的解决方案的详细内容,更多请关注其它相关文章!


# 正确地  # 陪玩网站怎么做推广的呢  # 江西seo排名的好方法  # 医美行业的营销推广方案  # 磁县推广营销招聘  # 营销定价与推广定价区别  # 潍坊专业网站seo优化费用  # 石家庄快速网站建设推广  # 郴州网站建设指南  # 哪个网站推广机械好卖  # 医疗产品推广网站  # 加载  # 有何不同  # 如何实现  # react  # 服务端  # 自定义  # 我们可以  # 表单  # 关键词  # 表单提交  # 应用开发  # ai  # 后端  # app  # json  # js  # word 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  J*aScript教程:根据元素文本内容动态设置背景色  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  J*aScript异步迭代器_j*ascript异步遍历  Log4j Console Appender性能瓶颈与高并发优化策略  蛙漫移动版在线看 蛙漫手机浏览器直达入口  铁路12306官网网页端快速入口 铁路12306官方首页登录教程  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  Golang指针如何与map组合使用_Golang map指针组合实践  狙击外星人小游戏开始_狙击外星人小游戏立即开始  b站赚钱渠道_b站收益来源  微博网页版首页入口 微博电脑端官网登录链接  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  163邮箱官方主页登录 直达网易邮箱登录核心页面  Win11怎么设置鼠标主按键_Win11鼠标左右键功能互换  J*aScript类型检查_j*ascript代码规范  服务端验证_j*ascript输入检查  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  葱吃多了会怎样 葱吃多了会伤胃吗  qq游戏跨平台入口_qq游戏多设备同步登录  AO3官方在线访问地址 Archive of Our Own最新镜像合集  J*aScript设计模式实践_j*ascript代码优化  Lar*el用户头像管理:实现图片缩放、存储与旧文件安全删除的最佳实践  ACG动漫视频网入口 ACG动漫*免费正版观看地址  cad如何更改注释性对象的比例_cad注释性比例调整方法  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  AO3官网镜像链接 Archive of Our Own同人文在线浏览  AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南  zookeeper 都有哪些功能?  Python Socket多播通信中指定源IP地址的实践指南  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  b站怎么取消点赞_b站点赞取消操作方法  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  J*aScript中向JSON对象添加新属性的正确姿势  深入理解J*aScript Promise异步执行与微任务队列  python3时间如何用calendar输出?  如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  12306怎么选座位选到安静区_12306选座安静区域选择策略  解决Django多数据库/多Schema环境下外键迁移问题  消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技  谷歌推RCS信息存档功能:公司可监控员工私密信息!  蛙漫2台版漫画地址 Manwa2正版网页版链接 

搜索