im在调用handleSearchClick
函数resetStates
之前,我遇到了难度设置page = 1
。当前,当调用resetStates
(单击search button
之后(时,它不会在第一次单击时将页面重置为1,而是在第二次搜索时单击它。
我尝试使用async await
,但是在handlesearchClick之前,这并不是将页面重置为1。在函数调用之前,如何将页面重置为1?任何反馈都将不胜感激。
这是我目前正在做的:
const resetStates = async () => {
const promise1 = setHasMore(true);
const promise2 = await setPage(1);
Promise.all([promise1, promise2])
.then(() => {
/* At this point I want page to equal 1 */
handleSearchClick();
})
.catch(error => {
throw new Error(error);
});
};
/**
* Handles event on search click
*/
const handleSearchClick = async () => {
setItems([]);
setIsLoading(true);
const base = handleBaseId();
const items = await fetchSearchPayload(page, value, option, base);
setIsLoading(false);
setInitialLoad(true);
setItems(items);
console.log('On Click', { option }, { page });
};
<SearchBar
onClickButton={resetStates}
onValueChange={handleChange}
value={value}
pageNum={page}
onEnter={handleSearchOnEnter}
/>
state updater is asynchronous
,但它不会回报您的承诺,因此您不能使用await
等待承诺完成。相反,您可以将页面值作为参数
const resetStates = async () => {
setHasMore(true);
setPage(1);
handleSearchClick(1);
};
/**
* Handles event on search click
*/
const handleSearchClick = async (page) => {
setItems([]);
setIsLoading(true);
const base = handleBaseId();
const items = await fetchSearchPayload(page, value, option, base);
setIsLoading(false);
setInitialLoad(true);
setItems(items);
console.log('On Click', { option }, { page });
};
<SearchBar
onClickButton={resetStates}
onValueChange={handleChange}
value={value}
pageNum={page}
onEnter={handleSearchOnEnter}
/>
否则您可以使用使用效应等待状态更新
const prevPage = usePrevious(page);
const prevHasMore = usePrevious(hasMore);
const initialRender = useRef(true);
useEffect(() => {
if(initialRender.current !== true) {
// you can check for hasMore also here
if((prevPage !== page && page == 1) && (prevHasMore !== hasMore && hasMore === true)) {
handleSearchClick();
}
}
}, [hasMore, page])
const resetStates = async () => {
setHasMore(true);
setPage(1);
};
/**
* Handles event on search click
*/
const handleSearchClick = async (page) => {
setItems([]);
setIsLoading(true);
const base = handleBaseId();
const items = await fetchSearchPayload(page, value, option, base);
setIsLoading(false);
setInitialLoad(true);
setItems(items);
console.log('On Click', { option }, { page });
};
您可以从以下帖子中引用usePrevious
的实现
如何比较react钩子上的oldvalues和newvalues使用效果?