【发布时间】:2022-01-08 14:21:51
【问题描述】:
我在这里有一个简化的反应原生应用程序,它可以进行网络调用并在加载时设置一个标志。有一个按钮 onPress 处理程序调用另一个方法 doSomething,根据 vscode 中的穷举-deps 插件,useCallback 中的两个方法和依赖数组都是正确的。
当应用程序加载时,我可以看到 isInitialized 标志设置为 true,但是之后按下按钮显示标志在 doSomething 方法中仍然为 false。在这种情况下,似乎 useCallback 方法没有根据它们的依赖数组重新生成。
import React, {useEffect, useState, useCallback} from 'react';
import { Text, View, TouchableOpacity } from 'react-native';
export default function App() {
const [isInitialized, setIsInitialized] = useState(false);
useEffect(() => {
fetch("http://www.google.com").then(() => setIsInitialized(true) );
}, []);
const onPress = useCallback(() => {
doSomething();
}, [doSomething]);
const doSomething = useCallback(() => {
console.log("doSomething", { isInitialized });
}, [isInitialized]);
return (
<View style={{flex:1, justifyContent:"center", alignItems:"center"}}>
{isInitialized &&
<Text>Initialized</Text>
}
<TouchableOpacity onPress={onPress} style={{padding:30, borderWidth:1}}>
<Text>Press Me</Text>
</TouchableOpacity>
</View>
);
}
有人能解释一下为什么会这样吗?请注意,陈旧状态仅在网络调用后设置标志时发生,并且仅在使用 useCallback() 的方法之间发生两次跃点时发生。如果按钮 onPress 直接设置为 doSomething,则标志正确显示为 true。
我在整个代码中都以这种方式使用 useCallback,我害怕由于不了解这里发生的事情而在意想不到的地方发现陈旧状态。
【问题讨论】:
标签: react-native async-await hook use-effect usecallback