如何在 React useEffect 中更改路由器

Posted

技术标签:

【中文标题】如何在 React useEffect 中更改路由器【英文标题】:How to change router in React useEffect 【发布时间】:2021-09-19 09:26:58 【问题描述】:

我尝试将 react-router-dom 与 useEffect 结合使用,我尝试登录后更改路由器,这是我的代码

const Member = () => 
  let history = useHistory(); 

  useEffect(()=>
      if(!signInStatus.current)
          return 
      
      signIn(sign_data) //async fetch api
      .then(response=> 
        if(response.status!==200)
          setSigninError(response.message)
        else
          window.alert("Welcome")
          history.push('/signup') //just test 
          //change route
        
    )
    .then(data=>signInStatus.current = false)
  )'
  return (
    <BrowserRouter>
        <Switch>
            <Route path="/signup" render=()=>return(
            <div className="app"><Header /><SignUp add=setData submittingStatus=submittingStatus error=signupError/></div>)/>
            <Route exact path="/" render=()=>return(
            <div className="app"><Header /><SignIn sign=setSign signInStatus=signInStatus error=signInError/></div>)/>
        </Switch>
    </BrowserRouter>    

所以在我做了一些研究之后,我认为这不起作用是因为路由器还没有渲染,因为我在同一页面上写了路由器,所以我想知道是否有任何方法可以改变路由器使用后效果。 堆栈溢出的方法有千种,但它们都是不同的版本,即使是自制的钩子。所以我希望得到一个自定义的答案,非常感谢!

【问题讨论】:

根本问题是您试图在 BrowserRouter 之外访问 useHistory,这是您无法做到的。您需要将 BrowserRouter 向上移动到父组件。 是的,这是我的问题,在我将路由器移动到父组件后,它就可以工作了!非常感谢你 【参考方案1】:

我了解您希望根据用户是否登录进行重定向。

<Route exact path='/'>
          <Route
      render=() => 
        if (isAuthenticated) 
          return <HomePage />;
         else 
          return (
            <Redirect
              to=
                pathname: "/login",
              
            />
          );
        
      
    />
        </Route>

在 useEffect 中,您可以检查用户是否已登录。如果是,则将 isAuthenticated 的值设置为 true,将自动处理重定向。

通过这个示例,如果用户未登录并尝试访问主页,您可以将用户重定向到 /login。希望这是与您的查询类似的示例。如果有任何困惑,请询问。

【讨论】:

以上是关于如何在 React useEffect 中更改路由器的主要内容,如果未能解决你的问题,请参考以下文章

React useEffect 不会在路由更改时触发

如何停止 React.useEffect 的副作用? [复制]

NextJS Router & Jest:如何模拟路由器更改事件

如何使用/不使用 useEffect 钩子在 React JS 函数中获取更改的(新)状态值?

如何使用 useEffect() 更改 React-Hook-Form defaultValue?

使用动态路由、下一个 JS 和 useEffect 在 React 中获取数据