React Hooks状态总是落后一步

时间:2019-05-17 12:37:41

标签: reactjs react-hooks

我无法重置页面=1。在... k=pm.Uniform('k',0,20) # same within replicates B=pm.Uniform('B',0,1000,shape=numrepl) # can vary between expts. P=pm.Uniform('P',0,1000,shape=numrepl) # can vary between expts. exprate=??? modelmu=??? 中,我有handleSearchClick,但是单击一秒钟较晚,因此第二次单击页面后将重置为1。

  

这是我当前的代码

setPage(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); }; 的建议都将受到欢迎!

2 个答案:

答案 0 :(得分:1)

似乎您正在尝试设置页面(异步),然后立即在您的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);
};

答案 1 :(得分:0)

问题在于状态更新与钩子状态更新器是异步的,就像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);
};