从上下文提供程序重定向react-router

IT技术 reactjs react-router react-context
2021-05-21 17:53:06

我是 React Router 的新手,并尝试使用新的 Conext API 从提供程序内部进行重定向。基本上我的提供者看起来像这样。

/* AuthContext.js */

class AuthProvider extends React.Component {

  state = { isLoggedIn: false }

  constructor() {
    super()
    this.login = this.login.bind(this)
    this.logout = this.logout.bind(this)
  }

  login() {

    this.setState({ isLoggedIn: true })

    // Need to redirect to Dashboard Here

  }

  logout() {
    this.setState({ isLoggedIn: false })
  }

  render() {
    return (
      <AuthContext.Provider
        value={{
          isLoggedIn: this.state.isLoggedIn,
          login: this.login,
          logout: this.logout
        }}
      >
        {this.props.children}
      </AuthContext.Provider>
    )
  }
}

const AuthConsumer = AuthContext.Consumer

export { AuthProvider, AuthConsumer }

我已经阅读了很多关于如何使用 props 传递历史对象以及如何使用组件的内容,但我看不出这些方法在这里是如何工作的。我的上下文提供程序位于树的顶部,因此它不是路由器的子项,因此我无法传递props。它也不是标准组件,所以我不能只插入一个组件,除非我误解了某些东西(这很有可能)。

编辑:看起来要走的路是 withRouter,但是如何在上面的代码中导出我的 AuthProvider 以便 history.push 在我的登录功能中可用?正如您所看到的,我正在导出包裹在 {} 中的多个组件,所以您能否将其中一个包裹在 HOC 中,并且您是否必须显式传递历史记录,或者它是否始终在被包裹的组件内可用?

1个回答

使用withRouter,诸如此类来访问历史记录。

 const AuthButton = withRouter( ({ history }) =>history.push("/"));

试试这个:

    import { Route } from "react-router-dom";

  class AuthProvider extends React.Component {
    yourFunction = () => {
      doSomeAsyncAction(() =>
        this.props.history.push('/dashboard')
      )
    }

    render() {
      return (
        <div>
          <Form onSubmit={ this.yourFunction } />
        </div>
      )
    }
  }

  export default withRouter(AuthProvider);

最好的解释可以在这里找到:Programmatically navigation using react router