reactjs - 反应钩子useState没有根据需要更新状态?
问题描述
我知道对 useState 函数的调用是异步的,但我遇到了点击事件和后续函数调用的问题,我的状态没有根据需要更新。
目前,我为三个按钮(第一个、下一个、最后一个)触发了 onClick 事件。基于哪个被点击 - 我想更新控制当前活动页面的 useState 钩子的状态:
const [page, setPage] = useState(0);
这是 onClick 事件:
const firstNextLast = (event) => {
if (event.target.name === 'first' && page !== 0) {
setPage((prevPage) => 0);
} else if (event.target.name === 'next' && page !== totalPages) {
setPage((prevPage) => prevPage + 1);
} else if (event.target.name === 'last') {
setPage((prevPage) => totalPages);
}
fetchFirstNextLast();
};
这是函数 fetchFirstNextLast():
const fetchFirstNextLast = () => {
const params = {
area: uriEncodeGJ.current,
page,
size: pageSize,
};
getEGMModelsWithin(gravitationalModel[0], params)
.then((data) => {
setGridData(data);
setSuccess(true);
setPage(data.data.pageNumber);
setPageSize(data.data.pageSize);
updateLat(data);
})
.catch((err) => {
setGridData(err);
setSuccess(false);
});
};
这个问题是page
当我调用 fetchFirstNextLast(); 时,值没有更新。我什至尝试将 fetchFirstNextLast() 作为回调传递给 setPage(),如下所示:
const firstNextLast = (event) => {
if (event.target.name === 'first' && page !== 0) {
setPage((prevPage) => 0, fetchFirstNextLast());
} else if (event.target.name === 'next' && page !== totalPages) {
setPage((prevPage) => prevPage + 1, fetchFirstNextLast());
} else if (event.target.name === 'last') {
setPage((prevPage) => totalPages, fetchFirstNextLast());
}
};
这些尝试都没有奏效。另外,我检查了是否在程序中的其他任何地方使用 setPage() 将状态返回到 0,所以这不是那种错误。告诫将不胜感激。
解决方案
React 中的状态更新是异步处理的,所以page
当你调用fetchFirstNextLast
. 如果您fetchFirstNextLast
像这样作为回调传递,它应该可以工作:
const firstNextLast = (event) => {
if (event.target.name === 'first' && page !== 0) {
setPage((prevPage) => 0, fetchFirstNextLast);
} else if (event.target.name === 'next' && page !== totalPages) {
setPage((prevPage) => prevPage + 1, fetchFirstNextLast);
} else if (event.target.name === 'last') {
setPage((prevPage) => totalPages, fetchFirstNextLast);
}
};
注意第二个参数setPages
只是函数,而不是调用函数的结果。
推荐阅读
- asp.net-mvc - web.config 文件中的自定义标头
- python - 正确使用range(),为什么pylint会抱怨:不迭代时引用了range built-in
- r - 生成反应输入表
- c# - 当字符串包含一些日文文本时,RichTextBox 字体更改 - C#
- python - Pandas - 获取与两个数据帧之间的 url 匹配的模式
- wpf - 如何将 BusyIndicator 居中到 MainWindow 的中心?
- windows - 在 Windows 上更改语言和区域设置
- kdb - 有没有更优雅/更实用的方法来计算平均价格?
- flutter - 检测用户何时未在 Flutter 中与应用程序交互
- php - Laravel 5.6 如何重定向到移动应用程序网址?