新闻中心
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
低代码数据分析平台,帮助企业快速交付深度数据
87
查看详情
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 应用中,如果子组件未能根据父组件传递的参数及时更新数据,需要检查以下几点:
- 父组件是否正确地更新了状态。
- 子组件的 useEffect 是否正确地依赖于父组件传递的参数。
- 是否存在表单提交或其他导致页面刷新的操作。
通过使用 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正版网页版链接


2025-10-08
浏览次数:次
返回列表
<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*>
);
}