我在重置页面 = 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
时都会递增,但我在计数本身落后一步时遇到了麻烦。
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
的任何建议,我们将不胜感激!
您似乎正在尝试设置页面(异步),然后立即在fetchSearchPayload
调用中使用page
状态。考虑到您始终在那里将页面设置为 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);
};
问题是状态更新与钩子状态更新器是异步的,就像 react 组件中的setState
一样。解决方案是手动传递页面以运行,而不是依赖于状态
/**
* Handles event on search click
*/
const handleSearchClick = async () => {
setItems([]);
const database = handleBaseId();
setPage(1);
const items = await fetchSearchPayload(1, value, option, database);
setIsLoading(false);
setItems(items);
};