当前位置: 首页 > 知识库问答 >
问题:

如何在axios响应后有条件地重定向到页面?

邹俊拔
2023-03-14

如果axios api为空或初始状态为空,如何有条件地重定向到页面。在下面的代码中,我使用axios更新状态,用户信息在状态中可用,但代码继续调用http://userapi.com/login在循环中。我试图实现的是,如果userinfo状态最初为空,则重定向到登录页面并进行身份验证。

class MyComponent extends React.Component {
  constructor() {
    super()
    this.state = {
      userinfo:{}
    }
  }
  
  componentDidMount(){
    axios.get('http://userapi.com/user')
    .then(res => {
        const userinfo = res.data;
        this.setState({ userinfo });
    })
    .catch(err => {
        console.log("Fetch error", err)
    })
    if (Object.keys(this.state.userinfo).length === 0) {
        window.location = 'http://userapi.com/login';
    }
  }
  render() {
    return (
      <React.Fragment>
        <Header>Welcome</Header>
      </React.Fragment>
    )
  }
}

我能够重定向罚款,但问题是与连续循环。即使用户信息存储重定向被调用(发生在循环中)

共有3个答案

朱经武
2023-03-14

在这里当你得到回应。。。

.then(res => {
        const userinfo = res.data;
        this.setState({ userinfo });
    })

检查res.data的用户信息。如果您确实收到了一个用户,那么您可以setState,如果没有用户重定向到登录页面。

至于重定向,请查看react路由器react路由器dom

我不会在React应用程序中使用纯javascript进行重定向/导航。

仇经武
2023-03-14

Axios返回Promise,因此在更新块中状态的函数之前,如果执行下面的条件,则执行带有的代码。因此,如果您需要在请求成功后检查更新的状态值,请将您的条件放入然后块中。

componentDidMount() {
    axios
      .get('http://userapi.com/user')
      .then((res) => {
        const userinfo = res.data;
        this.setState({ userinfo }, () => {
          if (Object.keys(this.state.userinfo).length === 0) {
            window.location = 'http://userapi.com/login';
          }
        });
      })
      .catch((err) => {
        console.log('Fetch error', err);
      });
  }

姬和豫
2023-03-14

您可以尝试以下方法:

class HeaderComponent extends React.Component {
  constructor() {
    super()
    this.state = {
      userinfo:{}
    }
  }
  
  componentDidMount(){
    axios.get('http://userapi.com/user')
    .then(res => {
        const userinfo = res.data;
        this.setState({ userinfo });
    })
    .catch(err => {
        console.log("Fetch error", err)
    })
  }
  componentDidUpdate(prevProps, { userinfo }) {
    if (userinfo !== this.state.userinfo
        && Object.keys(this.state.userinfo.w3idUser || {}).length === 0) {
        window.location = 'http://userapi.com/login';
    }
  }
  render() {
    return (
      <React.Fragment>
        <Header>Welcome</Header>
      </React.Fragment>
    )
  }
}

问题是,this.state.w3idUser从不存在,因为您正在将响应映射到userInfo状态。

 类似资料:
  • 我正在用Express开发一个具有聊天功能的多页面web应用程序(由socket.io提供)。用户可以邀请其他人到私人共享聊天室(该聊天室还有其他组件,如共享画板)。我想在完成邀请事务后将两个用户(邀请者和被邀请者)重定向到不同的URL。 因为socket.io不能访问路由的请求和响应对象,所以我尝试将socket.io实例传递到路由处理中。除了重复事件处理程序堆积在页面刷新上的问题之外,Expr

  • 我正在努力使一个向上投票和向下投票的功能在我的网站。然而,有一个我不喜欢的特殊行为,那就是每当用户点击按钮时,他不应该被重定向到另一个页面,而应该保持在同一页面上。 点击upvote按钮后,会转到url,这是我不想要的。我希望它保持在同一页面上,即 models.py views.py urls.py 查看-supplier.html

  • 我想在成功登录后为特定页面重定向用户。 我不希望用户在登录后导航到上次查看的页面。 我试过以下网址,但它显示我的错误。 错误:

  • 我想在成功登录后重定向到主页。我找遍了,但没有找到解决办法。提前感谢

  • 我有一个两步验证表单,这意味着第一个用户输入得到验证(在ValidatecKetData控制器中),如果一切正常,您可以进入下一个表单页面,我可以通过 问题:在第二页,用户需要上传一个文件,如果他不这样做,验证失败。 如果是这种情况,验证器类立即重定向,因为它是后路由,所以不起作用。 所以我创建了一个这样的获取路线: 并将其放入-方法: 我把它放到了-method中,因为如果用户不在第二页附加文件