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

React组件状态无法更新:点击登录提交后路由状态未改变

React路由状态未更新问题:提交按钮点击后路由状态无变化

我在React应用中尝试点击SignIn组件的提交按钮来改变路由状态,已将onRouteChange函数作为props传递给SignIn组件,但点击后路由状态并未改变,怀疑函数未成功传递。相关代码如下:

App组件代码

class App extends Component {
  constructor() {
    super();
    this.state = { route: "signed-out" };
  }
  onRouteChange = () => {
    this.setState({ route: "home" });
  };
  render() {
    return (
      <div class='main'>
        {this.state.route === "signed-out" ? (
          <div>
            <SignIn onRouteChange={this.onRouteChange}/>
          </div>
        ) : (
          <div>
            <SignOut  />
          </div>
        )}
      </div>
    );
  }
}

SignIn组件代码

const SignIn = ({ onRouteChange }) => {
  return (
    <div>
      <form>
        <div>Sign In</div>
        <div>Email</div>
        <input type='email' />
        <div>Password</div>
        <input type='password' />
        <input onClick={onRouteChange} type='submit' />
      </form>
    </div>
  );
};

问题原因与解决方案

函数传递本身是正常的,问题出在submit按钮的默认表单提交行为:点击submit会触发表单默认提交,导致页面刷新,React组件重新初始化,路由状态被重置回初始值。

解决方法一:在按钮点击事件中阻止默认行为

修改SignIn组件的submit按钮点击事件,先阻止表单默认提交,再执行状态修改:

<input 
  onClick={(e) => {
    e.preventDefault(); // 阻止表单默认提交
    onRouteChange();
  }} 
  type='submit' 
/>

解决方法二:给表单添加onSubmit事件(更规范)

直接在form标签上绑定onSubmit事件,统一处理默认行为和状态修改:

const SignIn = ({ onRouteChange }) => {
  return (
    <div>
      <form onSubmit={(e) => {
        e.preventDefault();
        onRouteChange();
      }}>
        <div>Sign In</div>
        <div>Email</div>
        <input type='email' />
        <div>Password</div>
        <input type='password' />
        <input type='submit' /> {/* 无需再绑定onClick */}
      </form>
    </div>
  );
};

这样处理后,表单不会刷新页面,onRouteChange修改的路由状态就能正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:35:37