【问题标题】:Setting React hooks state before function call在函数调用之前设置 React 钩子状态
【发布时间】:2019-05-20 13:55:35
【问题描述】:

在调用resetStates 中的handleSearchClick 函数之前,我无法设置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}
  />

【问题讨论】:

    标签: reactjs promise react-hooks


    【解决方案1】:

    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}
      />
    

    否则你可以使用 useEffect 来等待状态更新

    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的实现

    How to compare oldValues and newValues on React Hooks useEffect?

    【讨论】:

    • 页面是一个状态。我将它初始化为const [page, setPage] = React.useState(1);,如果我将 1 作为参数传递,它将不会被更新为状态。有没有办法可以将其重置为 1 并且不传递硬编码的数字?
    • 更新我的答案
    • 很高兴能帮上忙
    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2020-12-10
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多