Reactjs 反应导航验证流问题:警告:Can';t在未安装的组件上执行React状态更新

Reactjs 反应导航验证流问题:警告:Can';t在未安装的组件上执行React状态更新,reactjs,react-native,redux,react-navigation,Reactjs,React Native,Redux,React Navigation,我正在我的react本机应用程序中使用react导航。 我还将Redux用作状态管理 我有一个导航组件,它从redux商店检查用户,并定义导航 export const AppNavigator = ({auth}) => { const defineNavigator = () => { if (isClientUser(auth)) return <ClientNavigator />; if (isSellerUser(auth)) return

我正在我的react本机应用程序中使用react导航。 我还将Redux用作状态管理

我有一个导航组件,它从redux商店检查用户,并定义
导航

export const AppNavigator = ({auth}) => {
  const defineNavigator = () => {
    if (isClientUser(auth)) return <ClientNavigator />;
    if (isSellerUser(auth)) return <SellerNavigator />;
    return <AuthNavigator />;
  };

  return <NavigationContainer>{defineNavigator()}</NavigationContainer>;
};

const mapStateToProps = (state) => ({
  auth: state.auth,
});

export default connect(mapStateToProps, {})(AppNavigator);
我尝试使用
useffect
hook解决问题,如前所述:

但是没有帮助

我认为
AppNavigator
as中的问题是侦听
auth
状态。
对这个问题有什么建议吗?

那么
userService
为您做了什么?如果用户对导航器进行身份验证,则该导航器将被调出,
submit
中的任何后续“操作”/“状态更新”都与此无关。@drewrese谢谢您的回复。userService向服务器发出http请求(使用axios),向服务器发送数据。它会回报你的承诺,你需要等待吗?我想更多的是我的问题。如果用户成功通过身份验证(但用户界面已经更新,因此此操作失败),并且(可能)身份验证失败的错误和
auth
状态没有改变(并交换导航器),那么它所做的似乎就是将加载设为false?如果
userService.getAuthUser()
是应用程序的
auth
状态的一部分,则需要重新考虑登录流程。@drewrese您能提供一些示例或模式吗?
  const submit = () => {
    form.sms_code = filterValidationCode(code);
    setLoading(true);

    userService
      .register(form)
      .then((data) => {
        dispatch(login(data));
        userService
          .getAuthUser()
          .then((data) => dispatch(fetchAuthUser(data)))
          .catch((err) => setApiError(responseErrFromAPI(err)))
          .finally(() => setLoading(false));
      })
      .catch((err) => {
        if (
          err.response &&
          err.response.data &&
          err.response.data.error === BAD_USERNAME_ERROR
        ) {
          setApiError(i18n.t('errors.phone_exists'));
        } else {
          setApiError(responseErrFromAPI(err));
        }
      })
      .finally(() => setLoading(false));
  };