为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?

Posted

技术标签:

【中文标题】为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?【英文标题】:Why is withRouter used with connect () breaking my react app?为什么 withRouter 与 connect() 一起使用会破坏我的反应应用程序? 【发布时间】:2021-02-04 14:02:17 【问题描述】:

大家晚上好,

我一直在尝试将 withRouter 添加到我的反应应用程序中,这样它就不会因为连接功能而中断(参见下面的代码)。

我的代码正在运行,但是当我将 withRouter 添加到下面的行时,它会通过以下消息破坏我的应用程序:

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App));

错误:不变量失败:您不应在路由器外使用 >

我找到了这个主题:Invariant failed: You should not use <Route> outside a <Router>,但是当我尝试用单个路由器替换时,它并没有帮助我解决问题

请在下面找到使用的整个代码:

App.js

import React, useEffectfrom 'react';
import  BrowserRouter  from 'react-router-dom'
import  Route, Redirect from 'react-router-dom'
import  withRouter  from 'react-router-dom'
import  connect  from 'react-redux'
import * as actions from './store/actions/index'

// Composants
import Layout from './components/hoc/Layout/Layout'
import BudgetHandler from './components/BudgetHandler/BudgetHandler'
import DashBoard from './components/DashBoard/DashBoard'
import Movements from './components/Movements/Movements'
import Home from './components/Home/Home'
import Logout from './components/Logout/Logout'

import classes from './App.module.css'

const App = (props) => 
  useEffect(() => 
    props.onTryAutoSignup()
  ,[])

  let routes = <React.Fragment>
    <Route path="/" exact component=Home />
    <Redirect to="/" />
    </React.Fragment>

  if(props.isAuthentificated) 
    routes = <React.Fragment>
        <Route path="/movements" component=Movements />
        <Route path="/dashboard" component=DashBoard />
        <Route path="/logout" component=Logout />
        <Route path="/handler" component=BudgetHandler />
        <Redirect to="/dashboard" />
    </React.Fragment>
  

  return (
    <div className=classes.App>
      <BrowserRouter>
      <Layout>
        routes
      </Layout>
      </BrowserRouter>
    </div>
  );


const mapStateToProps = state => 
  return 
    isAuthentificated: state.auth.token !== null
  


const mapDispatchToProps = dispatch => 
  return 
    onTryAutoSignup: () => dispatch(actions.authCheckState())
  


export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App));

发生这种情况是因为我试图将此函数添加到 useEffect 挂钩中以永久检查用户是否是 auth:

在actions/auth.js中

export const authCheckState = () => 
    return dispatch => 
         const token = localStorage.getItem('token')
         if(!token) 
             dispatch(logout())
          else 
             const expirationTime = new Date(localStorage.getItem('expirationDate'))
             const userId = localStorage.getItem('userId')
             if(expirationTime > new Date())
                 dispatch(logout())
              else 
                dispatch(finalSignIn(token, userId))
                dispatch(checkAuthTimeout(expirationTime.getSeconds() - new Date().getSeconds()))
             
         
    

感谢您的帮助

晚安

【问题讨论】:

【参考方案1】:

withRouter 只能用在 element 的子组件中。在您的情况下,可以与运动、仪表板和其他儿童一起使用。在导出动作时使用它,例如

export default withRouter(Movements)

在运动页面上。

【讨论】:

以上是关于为啥 withRouter 与 connect() 一起使用会破坏我的反应应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

connect 和 withRouter 问题

使用 connect 和 withRouter 包装组件的顺序是不是重要

输入一个同时使用 withRouter 和 connect 的 HOC 组件

浅谈connect,withRouter,history,useState,useEffect

带连接的 withRouter 在 v5.0.0 中不起作用?

如何通过 react-redux 使用 refs 进行反应,withRouter?