reactjs - React Hooks 状态总是落后一步
问题描述
我在重置页面时遇到了问题 = 1。在handleSearchClick
我有setPage(1)
但它的一次点击晚了,所以在第二次点击之后页面将重置为 1
这是我当前的代码
const [page, setPage] = React.useState(1);
//Other states as well
/**
* Handles event on search click
*/
const handleSearchClick = async () => {
setItems([]);
const database = handleBaseId();
setPage(1);
const items = await fetchSearchPayload(page, value, option, database);
setIsLoading(false);
setItems(items);
};
我也尝试在按钮本身中重置页面,但收到react limits the number of renders to prevents an infinite loop
错误消息
这就是我尝试做的
<SearchBar
onClickButton={handleSearchClick}
onValueChange={handleChange}
value={value}
pageNum={page}
onEnter={handleSearchOnEnter}>
{setPage(1)}
</SearchBar>
我还尝试使用useEffect
并添加了一个count
每次searchBar
单击时都会增加的状态,但是我遇到了 count 本身落后一步的问题。
const [count, setCount] = React.useState(0);
React.useEffect(() => {
setPage(1);
}, [count]);
/**
* Handles event on search click
*/
const handleSearchClick = async () => {
setCount(count+1);
setItems([]);
const database = handleBaseId();
setPage(1);
const items = await fetchSearchPayload(page, value, option, database);
setIsLoading(false);
setItems(items);
};
任何有关如何在page
没有任何延迟的情况下重置的建议都值得赞赏!
解决方案
您似乎正在尝试设置页面(异步),然后立即在您的通话中使用该page
状态。fetchSearchPayload
考虑到您总是在此处硬编码将页面设置为 1,您也可以在fetchSearchPayload
通话中硬编码 1。
您可以采用的另一条路线是仅在页面更新后通过执行以下操作进行异步调用:
React.useEffect(() => {
const database = handleBaseId();
const items = await fetchSearchPayload(page, value, option, database);
setIsLoading(false);
setItems(items);
}, [ page ]);
/**
* Handles event on search click
*/
const handleSearchClick = async () => {
setItems([]);
setPage(1);
};
推荐阅读
- android - Unity 和地图服务
- mysql - Laravel SQLSTATE[HY000] [1045] 访问被拒绝,使用 aws EC2 ubuntu
- redis - 使用 Nestjs 在 redis 存储中存储一个值
- python - QLineEdit 中带有 title() 的问题?
- reactjs - React Semantic UI - 关于表单验证的文档在哪里?
- python - 如何将用户输入的输入与字典中的列表相匹配
- html - 在文本文件中写下用户输入
- x86 - 如何在 320x200 屏幕的一小部分打印微型 BMP 而不会影响屏幕上已有的图片
- flutter - 将 Flutter 应用程序和代码下载回 laptoo
- html - 画布元素阻塞选择