首页 > 解决方案 > useFocusEffect 不更新 setstate

问题描述

我有这个 useFocusEffect 功能:

useFocusEffect(
    useCallback(() => {
        async function setFilterValue() {
            let filterValue = await AsyncStorage.getItem('filterValue');
            let inputValue = JSON.parse(filterValue);
            if (gpsFilterValue === null) {
                setGpsFilterValue(inputValue);
                console.log('null')
                // setRefreshing(true)
            } else if (inputValue !== parseInt(gpsFilterValue)) {
                setGpsFilterValue(inputValue);
                console.log('refreshing1')
                setTimeout(() => {
                    console.log(gpsFilterValue)
                }, 1000);
                //console.log(inputValue + ' ' + gpsFilterValue)
                //setRefreshing(true)
            } else {
                console.log('test')
            }
        }
        setFilterValue();
    }, [])
);

当我在 setTimeout 中调试 gpsFilterValue 时,它​​保持未定义,但是当我在渲染中创建一个按钮以调试 gpsFilterValue 状态值并按下它时,它已更新。为什么价值观不一样?

标签: react-nativereact-navigation-v5

解决方案


从外观上看,它gpsFilterValue是您状态的一部分,因为您在回调中调用了一个状态设置器。但是,您useCallback没有将gpsFilterValue其列为依赖项(作为 . 的第二个参数的空数组useCallback。将其添加到该依赖项列表中,您应该会看到更新的值。

useFocusEffect(
    useCallback(() => {
        async function setFilterValue() {
            let filterValue = await AsyncStorage.getItem('filterValue');
            let inputValue = JSON.parse(filterValue);
            if (gpsFilterValue === null) {
                setGpsFilterValue(inputValue);
                console.log('null')
                // setRefreshing(true)
            } else if (inputValue !== parseInt(gpsFilterValue)) {
                setGpsFilterValue(inputValue);
                console.log('refreshing1')
                setTimeout(() => {
                    console.log(gpsFilterValue)
                }, 1000);
                //console.log(inputValue + ' ' + gpsFilterValue)
                //setRefreshing(true)
            } else {
                console.log('test')
            }
        }
        setFilterValue();
    }, [gpsFilterValue])
);

推荐阅读