You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中Hook状态变化时如何实现页面跳转?

React Native登录后跳转页面的问题修复方案

当前实现的核心问题

你现在在组件渲染阶段直接调用gotoVerifyTAC(),这会触发无限重渲染循环:

  • 当!loading && data?.accessToken条件满足时,执行导航跳转,而导航操作会触发组件重新渲染
  • 重新渲染时再次检查条件,满足后又执行导航,陷入死循环
  • React要求渲染逻辑是纯函数,不能在渲染阶段执行导航这类副作用操作

修复方案:使用useEffect监听状态变化

通过useEffect钩子监听loading和data的状态变化,仅当状态满足跳转条件时执行导航操作:

import { useEffect } from 'react'; // 记得导入useEffect

function Signin({navigation}) {

  const [form, setForm] = useState({});
  const [errors, setErrors] = useState({});

  const {
    authDispatch,
    authState: {error, loading, data},
  } = useContext(GlobalContext);

  const onPressLogin = () => {
    signin(form)(authDispatch);
  };

  function gotoVerifyTAC() {
    navigation.navigate(VERIFY_OTP_SCREEN);
  }

  // 监听状态变化,满足条件时执行跳转
  useEffect(() => {
    if (!loading && data?.accessToken) {
      gotoVerifyTAC();
    }
  }, [loading, data, navigation]); // 依赖数组包含所有用到的外部变量

  return (
    <View>
      {loading && <LoadingModal loading={loading} size={'large'} />}
      <View>
        {/* 移除渲染阶段的跳转调用 */}
        <SigninComponent
          onChange={onChange}
          onPressLogin={onPressLogin}
          onPressResetPassword={onPressResetPassword}
          form={form}
          errors={errors}
          error={error}
          loading={loading}
          data={data}
          navigation={navigation}
        />
      </View>
    </View>
  );
}

export default Signin;

关键说明

  • useEffect是React处理副作用的标准方式,只有当依赖数组中的loading、data或navigation发生变化时,才会执行内部逻辑,彻底避免无限循环
  • 依赖数组必须包含所有在副作用中用到的外部变量,符合React的hooks规则
  • 渲染阶段只负责输出UI,所有状态变更、导航这类操作都要放在副作用或事件回调中

内容的提问来源于stack exchange,提问作者AbhinayMe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:15:05