useFocusEffect不会更新setstate

时间:2020-06-08 15:38:44

标签: react-native react-navigation-v5

我有这个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状态值并按下它时,它已更新。值如何不同?

1 个答案:

答案 0 :(得分:0)

从外观上看,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])
);