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

React中异步函数执行完成后如何实现页面重定向?

解决表单提交后页面重定向无效的问题

首先得指出你代码里的核心问题:你更新后的submitSite是一个独立的异步函数,并不是React组件的类方法,所以函数里的this是undefined,调用this.createSite和this.props.history肯定会直接报错——代码在执行到重定向逻辑之前就挂了,自然不会触发页面跳转。另外,你在异步函数内部定义createSite的语法也有问题,会导致语法错误。

下面分几种场景给你对应的解决方案:

场景1:类组件中使用

如果你的表单是类组件,需要把submitSite作为组件的类方法,同时确保this的指向正确,还要用withRouter高阶组件包裹组件来获取history对象:

import { API } from "aws-amplify";
import React, { Component } from "react";
import { withRouter } from "react-router-dom";

class YourForm extends Component {
  // 用箭头函数自动绑定this
  createSite = (site) => {
    return API.post("notes", "/notes", { body: site });
  };

  submitSite = async (values) => {
    try {
      await this.createSite({ content: values });
      // 现在能正确拿到history对象了
      this.props.history.push("/");
    } catch (e) {
      alert(e.message || "表单提交失败");
    }
  };

  render() {
    return (
      <form onSubmit={(e) => {
        e.preventDefault();
        // 这里替换成你获取表单值的逻辑
        const formValues = {};
        this.submitSite(formValues);
      }}>
        {/* 你的表单元素 */}
      </form>
    );
  }
}

// 用withRouter包裹,让组件能拿到history props
export default withRouter(YourForm);

场景2:函数组件中使用

如果是函数组件,直接用React Router的useHistory钩子获取history对象,更简洁:

import { API } from "aws-amplify";
import React from "react";
import { useHistory } from "react-router-dom";

const YourForm = () => {
  const history = useHistory();

  const createSite = (site) => {
    return API.post("notes", "/notes", { body: site });
  };

  const submitSite = async (values) => {
    try {
      await createSite({ content: values });
      history.push("/");
    } catch (e) {
      alert(e.message || "表单提交失败");
    }
  };

  return (
    <form onSubmit={(e) => {
      e.preventDefault();
      const formValues = {};
      submitSite(formValues);
    }}>
      {/* 你的表单元素 */}
    </form>
  );
};

export default YourForm;

场景3:submitSite必须是独立工具函数

如果因为业务需求,submitSite需要作为独立的工具函数,那你需要把history对象作为参数传入:

// utils/submitSite.js
import { API } from "aws-amplify";

export default async function submitSite(values, history) {
  try {
    await API.post("notes", "/notes", { body: { content: values } });
    history.push("/");
  } catch (e) {
    alert(e.message || "表单提交失败");
  }
}

// 在组件中调用
import submitSite from "./utils/submitSite";
import { useHistory } from "react-router-dom";

const YourForm = () => {
  const history = useHistory();

  const handleSubmit = (e) => {
    e.preventDefault();
    const formValues = {};
    submitSite(formValues, history);
  };

  return <form onSubmit={handleSubmit}>{/* 表单元素 */}</form>;
};

另外提一句:你之前尝试window.location.replace()无效,大概率也是因为代码报错没执行到那一步。可以先在try块末尾加个console.log("提交成功"),验证请求是否真的成功了——比如你之前的代码里,第一个请求是API.post("sites", "/sites"),后来改成了"notes", "/notes",要确认接口路径是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:02:37