新闻中心

组件参数未更新导致数据未刷新:React应用中数据请求的正确姿势

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

组件参数未更新导致数据未刷新:react应用中数据请求的正确姿势

在React应用开发中,经常会遇到组件接收到新的参数后,本应重新获取数据并更新UI,但实际却没有发生的情况。本文将通过一个具体的例子,分析这种问题的原因并提供解决方案。正如摘要中所述,问题的核心在于表单提交导致的页面刷新。

问题分析:表单提交与页面刷新

在提供的代码中,N*bar 组件包含一个表单,当用户点击 "Search" 按钮时,会触发 onSearchClicked 函数,进而更新 App 组件中的 query 状态。AttacksGrid 组件接收 query 作为 props,并在 useEffect 中监听 query 的变化,从而发起新的数据请求。

然而,问题在于

解决方案:阻止表单默认行为

解决这个问题的关键在于阻止表单的默认提交行为。可以通过在 onClick 事件处理函数中使用 e.preventDefault() 来实现。

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(); // 阻止表单默认提交行为
              onSearchClicked(message);
            }}
          >
            Search
          </button>
        </form>
      </div>
    </n*>
  );
}

通过添加 e.preventDefault(),我们阻止了表单的默认提交行为,避免了页面刷新。现在,点击 "Search" 按钮只会触发 onSearchClicked 函数,更新 query 状态,AttacksGrid 组件也会正确地接收到新的 query 值,并从后端获取相应的数据。

青泥AI 青泥AI

青泥学术AI写作辅助平台

青泥AI 360 查看详情 青泥AI

进一步优化:useEffect 依赖项

虽然 e.preventDefault() 解决了页面刷新的问题,但仍然需要注意 useEffect 的依赖项。在 AttacksGrid 组件中,useEffect 的依赖项是 [query],这意味着只有当 query 的值发生变化时,才会重新执行 useEffect 中的代码。

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>
    </>
  );
}

确保 useEffect 的依赖项包含了所有需要在 effect 中使用的状态或 props。如果遗漏了依赖项,可能会导致 effect 中的代码使用过时的值,从而产生意想不到的结果。

总结

解决React组件参数更新后数据未刷新的问题,需要仔细分析问题的根本原因。在本例中,表单提交导致的页面刷新是罪魁祸首。通过 e.preventDefault() 阻止表单的默认行为,并正确设置 useEffect 的依赖项,可以确保组件在接收到新的参数时能够正确地从后端获取并展示数据。在实际开发中,要养成良好的习惯,仔细检查表单提交行为和 useEffect 的依赖项,避免类似问题的发生。

以上就是组件参数未更新导致数据未刷新:React应用中数据请求的正确姿势的详细内容,更多请关注其它相关文章!


# js  # react  # 服务端  # 自定义  # 到新  # 表单  # 表单提交  # 应用开发  # ai  # 后端  # app  # json  # 百姓网站在百度推广  # 制造业SEO软件  # 潼南网站优化推广  # 口碑营销推广找谁好  # 本溪网站建设公司电话  # 大足贸易网站建设  # 南京seo优化收费标准  # 网站推广必备知识点图片  # 为什么做企业网站推广  # UG学习网站建设  # 也会  # 加载  # 有何不同  # 如何实现  # 正确地 


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


相关推荐: Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程  微信网页版扫码登录入口 微信网页版二维码登录入口  poki网页游戏推荐_poki免费游戏平台入口  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧  铃兰之剑为这和平的世界希里技能组及加点推荐  蛙漫官网漫画入口地址_蛙漫在线畅读无广告弹窗  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  qq游戏网页版直接玩_qq游戏免下载快速入口  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  Win11网速慢怎么解决 Win11网络设置优化解除限速  Go RPC HTTP服务正确实现与常见陷阱解析  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  Python实现多节点属性重叠度分析教程  蛙漫安全无毒 官方认证的绿色入口  Animex动漫社网入口地址 Animex动漫社网正版在线入口  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  单射、满射与双射的关系 一文理清所有逻辑  Mac怎么锁定备忘录_Mac备忘录加密设置教程  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  c++中为什么推荐使用using替代typedef_c++现代化类型别名  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  c++如何实现单例设计模式_c++线程安全的单例模式写法  火锅吃太多会怎样 火锅吃太多会上火吗  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  实现全屏滚动与导航点:专业教程  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  妖精动漫免费平台 妖精动漫官网资源观看网址  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  我的世界官方游戏入口 我的世界官网平台直达链接  在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  抖音网页版快捷访问 抖音网页版网页版入口操作教程  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新 

搜索