【发布时间】:2021-01-03 07:22:15
【问题描述】:
我有以下处理路由的index.js 文件:
import React from "react";
import ReactDOM from "react-dom";
import "bootstrap/dist/css/bootstrap.css";
import "./global.css";
import Login from "./pages/Login/Login";
import { Provider } from "react-redux";
import configureStore, { history } from "./store";
import { Route, Switch } from "react-router";
import * as serviceWorker from "./serviceWorker";
import { ConnectedRouter } from "connected-react-router";
import Home from "./pages/Home/Home";
import AuthProvider from "./AuthProvider";
import IsLoggedIn from "./components/auth/IsLoggedIn";
import IsNotLoggedIn from "./components/auth/IsNotLoggedIn";
const store = configureStore();
ReactDOM.render(
<Provider store={store}>
<AuthProvider>
<ConnectedRouter history={history}>
<Switch>
<Route exact path="/" component={() => <IsNotLoggedIn component={Login} redirect="/Home"/>}/>
<Route path="/Login" component={() => <IsNotLoggedIn component={Login} redirect="/Home"/>}/>
<Route path="/Home" component={() => <IsLoggedIn component={Home} redirect="/Login"/>} />
<Route render={() => <div>Not Found</div>} />
</Switch>
</ConnectedRouter>
</AuthProvider>
</Provider>,
document.getElementById("root")
);
serviceWorker.unregister();
它被一个名为AuthProvider的组件包围:
import React, { useEffect } from "react";
import { connect } from "react-redux";
import { getAuth } from "./authSlice";
const AuthProvider = (props) => {
const {dispatch, children} = props;
console.log(props, "AUTH PROPS");
useEffect(() => {
dispatch(getAuth());
}, []);
return <>{children}</>;
};
const mapStateToProps = (state) => {
return state.auth;
};
export default connect(mapStateToProps)(AuthProvider);
这样我们就可以在每次页面加载时检索身份验证详细信息。
现在,如果您查看我的路由,我创建了两个组件来根据身份验证处理重定向:IsLoggedIn 和 IsNotLoggedIn,两者都非常相似。这里是IsLoggedIn:
import React from "react";
import { connect } from "react-redux";
import { Redirect } from "react-router";
const IsLoggedIn = (props) => {
const { component, auth, redirect } = props;
if(auth.authenticated) {
return component;
}
return <Redirect to={redirect}/>
};
const mapStateToProps = (state) => {
return {
auth: state.auth,
};
};
export default connect(mapStateToProps)(IsLoggedIn);
当我仅使用其中一条路线Home 对其进行测试时,它运行良好。当我尝试将其添加到其余部分时,如您在上面的代码中所见,我收到以下错误:
×
Error: Objects are not valid as a React child (found: object with keys {$$typeof, type, compare, WrappedComponent, displayName}). If you meant to render a collection of children, use an array instead.
in IsNotLoggedIn (created by ConnectFunction)
in ConnectFunction (at src/index.js:23)
in component (created by Context.Consumer)
in Route (at src/index.js:23)
in Switch (at src/index.js:22)
in Router (created by ConnectedRouter)
in ConnectedRouter (created by Context.Consumer)
in ConnectedRouterWithContext (created by ConnectFunction)
in ConnectFunction (at src/index.js:21)
in AuthProvider (created by ConnectFunction)
in ConnectFunction (at src/index.js:20)
in Provider (at src/index.js:19)
【问题讨论】:
标签: reactjs redux react-redux react-router