简体   繁体   English

为什么 state 没有改变

[英]Why the state is not changed

I have the following function, and there is two Alerts.我有以下function,有两个Alerts。 The first Alert shows that the settingsChangedRoute is true , so after setSettingsChanged(settingsChangedRoute) ;第一个 Alert 显示settingsChangedRoutetrue ,所以在setSettingsChanged(settingsChangedRoute)之后; the settingsChanged value should be true too, as I understand it.据我了解, settingsChanged值也应该为真。 But it is false and I don't get why.但这是错误的,我不明白为什么。 Please help to fix it, as it should be true .请帮助修复它,因为它应该是true

const [settingsChanged, setSettingsChanged] = useState(false);
//...
const load = async () => {
    if (!!(route?.params)) {
      const settingsChangedRoute = route.params.settingsChanged;
      Alert.alert(`settingsChangedRoute === ${settingsChangedRoute}`);
      setSettingsChanged(settingsChangedRoute);
    }
    const savedMode = await AsyncStorage.getItem('mode');
    if (!!savedMode) {
      const savedBlocked = await AsyncStorage.getItem('blocked');
      if (savedBlocked) {
        setBlocked(JSON.parse(savedBlocked));
      }
      setMode(savedMode);
      const savedTurn = await AsyncStorage.getItem('turn');
      setTurn(savedTurn);
      const savedFieldSize = await AsyncStorage.getItem('fieldSize');
      const parcedFieldSize = JSON.parse(savedFieldSize);
      setFieldSize(parcedFieldSize);
      const savedDifficulty = await AsyncStorage.getItem('difficulty');
      setDifficulty(savedDifficulty);
      Alert.alert(`settingsChanged === ${settingsChanged}`);
      if (settingsChanged) {
        setInitialFieldState();
        setSettingsChanged(false);
      } else {
        const fieldStateJSON = await AsyncStorage.getItem('fieldState');
        if (!!fieldStateJSON) {
          setFieldState(JSON.parse(fieldStateJSON));
        }
      }
    } else {
      setInitialFieldState();
    }
  }

The useState() hook updates values asynchronously. useState()钩子异步更新值。 So, even though you updated settingsChanged to true by the time the code execution reached to the second alert, the values are not changed yet.因此,即使您在代码执行到达第二个警报时将settingsChanged更新为 true,但值尚未更改。 It is, therefore, advised to use useEffect hook.因此,建议使用useEffect挂钩。

Refer to this doc: https://reactjs.org/docs/hooks-effect.html请参阅此文档: https://reactjs.org/docs/hooks-effect.html

useEffect(()=>{
   // write code that will execute after settingsChanged has been updated
},[settingsChanged])

If you need to just execute a code only when settingsChanged value is updated to true, you can simply add a condition inside useEffect如果您只需要在settingsChanged值更新为 true 时才执行代码,您可以简单地在 useEffect 中添加一个条件

useEffect(()=>{
   if(settingsChanged) {
            // write code that will execute after settingsChanged has been 
            // updated to true
   }
},[settingsChanged])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM