【问题标题】:React Native unmounted screen renders when Redux state changed当 Redux 状态更改时,React Native 未安装的屏幕呈现
【发布时间】:2021-09-25 07:13:46
【问题描述】:

我将 React Native 与 Redux 一起使用。目前我有两个使用相同 redux 状态的屏幕。两个屏幕都在一个堆栈导航上。第一个屏幕中有一个使用效果调用,当 redux 状态更改时触发。同样的一个使用效果调用也在第二个屏幕中,当相同的 redux 状态改变时触发。问题是当我从屏幕 1 导航到屏幕 2 并更改状态时,它会触发两种使用效果。

这是第一个屏幕。我正在使用 navigation.navigate('LoginScreen') 导航到第二个屏幕

export default function StartScreen({route, navigation, props}) {
  const {loginStatus,user} = useSelector(state => state.auth);

const initialRender = useRef(true);
  useEffect(() => {
    console.log('use effect');
    if (!initialRender.current) {
      if (loginStatus === 'success') {
        hideDialog();
        navigation.reset({
        index: 0,
        routes: [{name: 'Dashboard'}],
        });
      } else if(loginStatus === 'failed') {
        alert('invalid QR code!')
        hideDialog();
        dispatch(clearLoginStatus())
      }
    } else {
      initialRender.current = false;
    }
  }, [loginStatus]);

return (
    <Background maxWidth="85%">
      <VectorHeading
        img={require('../assets/startvector.png')}
        marginBottom={50}
      />
      <Header>xxxxxxx</Header>
      <Paragraph>
        The easiest way to start with your amazing application.
      </Paragraph>
      <Button mode="contained" onPress={() => navigation.navigate('QRScanner')}>
        Scan QR
      </Button>
      <Button mode="contained" onPress={() => navigation.navigate('LoginScreen')}>
        Login
      </Button>

      <Loader visible={visible} hideDialog={hideDialog} />
    </Background>
  );

.........

这是第二屏

export default function LoginScreen({navigation, props}) {
  ....
  const {isLoggedIn, loginStatus,user} = useSelector(state => state.auth);
  

const initialRender = useRef(true);
  useEffect(() => {
    console.log('use effect');
    if (!initialRender.current) {
      if (loginStatus === 'success') {
        hideDialog();
        forward();
      } else if(loginStatus === 'failed') {
        alert('invalid credentials!')
        hideDialog();
        dispatch(clearLoginStatus())
      }
    } else {
      initialRender.current = false;
    }
  }, [loginStatus]);

.........

当“loginStatus”更改时,它会在两个屏幕中呈现 useefect 函数并显示在 useeffect 中设置的两个警报。

任何帮助将不胜感激。

【问题讨论】:

    标签: react-native react-redux react-native-navigation


    【解决方案1】:

    尝试在组件卸载时添加另一个 useEffect 来清理,

    useEffect(() => {
     return () => {
       console.log("cleaned up");
     };
    }, []);
    

    【讨论】:

    • 它不适用于您提到的 useEffect。它仍然会触发之前的页面状态更改。还有其他方法可以尝试 mchn 吗?
    猜你喜欢
    • 2019-12-04
    • 2017-09-21
    • 1970-01-01
    • 2018-02-19
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    相关资源
    最近更新 更多