为什么 withRouter 与 connect () 一起使用会破坏我的 React 应用程序?

Why is withRouter used with connect () breaking my react app?

大家晚上好,

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

我的代码可以正常工作,但是当我将 withRouter 添加到下面的行时,它会破坏我的应用程序并显示以下消息:

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

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

我找到了这个主题: 但是当我尝试用单个路由器替换时它并没有帮助我解决问题

请在下面找到使用的全部代码:

App.js

import React, {useEffect}from '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 挂钩以永久检查用户是否已授权:

在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()))
             }
         }
    }
}

感谢您的帮助

晚上好

withRouter 只能在element 的children 个组件中使用。在您的情况下,可以与 Movements、DashBoard 和其他 childrens 一起使用。在导出运动时使用它

export default withRouter(Movements)

在运动页面上。