当前位置: 首页 > 知识库问答 >
问题:

将Redux状态传递给React组件时的无限循环

文国发
2023-03-14

[编辑]

问题不在于isAuth属性,而在于ProtectedRoad中重定向组件中的props.location!尽管如此,如果你有一个问题来理解use Selector或mapStateToProps,去@Versifici的答案!

[结束编辑]

我有一个React/Redux应用程序,在authReducer中具有isAuth属性。我想将其传递给我的ProtectedRoute组件以检查行为。

我有这个错误,我确信它与传递isAuth到ProtectedComponent有关:

未捕获错误:超过最大更新深度

我的AppContainer

import React, {useEffect, useState} from "react";
import {Router, Route} from 'react-router-dom';
import history from "./constants/history";
import * as ROUTES from './constants/routes';
import ProtectedRoute from "@components/HOC/ProtectedRoute";

import LandingPage from "../domains/Main/LandingPage";
import AdminLandingPage from '@domains/Admin/AdminLandingPage';
import SessionLandingPage from '@domains/Session/SessionLandingPage';
import SignInPage from "../domains/Auth/SignInPage/SignInPage";
import SignUpPage from "../domains/Auth/SignUpPage/SignUpPage";
import PasswordForgetPage from "../domains/Auth/PasswordForgetPage/PasswordForgetPage";
import { useSelector } from 'react-redux'


function AppContainer() {

    const [checkAuth, setCheckAuth] = useState(false);
    const { isAuth } = useSelector(state => state.authReducer);



    return (
        <Router history={history}>
            <ProtectedRoute exact  path={ROUTES.MAIN_LANDING} component={LandingPage}/>
            <Route exact path={ROUTES.SIGN_IN} component={SignInPage}/>
            <ProtectedRoute exact path={ROUTES.ADMIN_LANDING} component={AdminLandingPage}/>
            <ProtectedRoute exact path={ROUTES.SESSION_LANDING} component={SessionLandingPage}/>
        </Router>
    );
}


export default AppContainer;

Console.log按预期显示值“False”。

只是通过使用选择器,我有无限循环错误。

AuthReducer的状态:

const INITIAL_STATE = {
    loading: false,
    error: '',
    isAuth : false
};

我的保护路由组件

const ProtectedRoute = (
    {
        component: Component,
        isAuth,
        ...rest
    }
) => {
    if(isAuth === null) {
        return 'loading...'
    }
    return (
        <Route
            {...rest}
            render={(props) => {
                return isAuth
                    ?
                    (<Component {...rest} {...props} />) :
                    (<Redirect to={{pathname: '/', state: {from: props.location}}}/>)
            }}
        />

    )
};

export default ProtectedRoute;

共有1个答案

乐正涵意
2023-03-14

我建议您使用mapStateToProps将数据从存储区发送到组件的道具,您必须首先从react redux包导入connect方法,

然后在MapStateTops函数中,将props中的数据名称(isAuth)作为属性,将全局存储中的位置(state.authReducer.isAuth)作为值

import { connect } from "react-redux";

function AppContainer(props) {
    const { isAuth } = props;
    return (
        <Router history={history}>
            <ProtectedRoute exact isAuth={isAuth} path={ROUTES.MAIN_LANDING} component={LandingPage}/>
            <Route exact path={ROUTES.SIGN_IN} component={SignInPage}/>
            <ProtectedRoute exact isAuth={true} path={ROUTES.ADMIN_LANDING} component={AdminLandingPage}/>
            <ProtectedRoute exact isAuth={true} path={ROUTES.SESSION_LANDING} component={SessionLandingPage}/>
        </Router>
    );
}

const mapStateToProps = (state) => ({
  isAuth: state.authReducer.isAuth
});

export default connect(mapStateToProps, null)(AppContainer);
 类似资料:
  • 问题内容: 我有一个具有与组件本身相同类型的子组件的组件。我也可以渲染孩子,但是孩子似乎无法访问他们的状态。我在Redux中使用React 另外,我正在使用Material-ui中的ListItem(它们最终呈现在List组件中),并且我的代码受到官方redux回购中的树视图示例的严重影响。我的状态如下所示: 所示状态与树状示例中的状态相同 问题答案: 好吧,如果我理解正确,那么您希望这些组件从r

  • 我试图找出如何通知另一个组件状态更改。假设我有3个组件——pp.jsx、Header.jsx和SidebarPush.jsx我只是想用onclicka切换一个类。 因此,标题。jsx文件将有2个按钮,点击时将切换状态为真或假。另外两个组件是应用程序。jsx和Header。jsx需要了解这些状态的变化,以便在这些状态发生变化时可以切换类。

  • 你好,亲爱的堆栈溢出,我刚刚启动了一个盖茨比网站,但我有通过传递给组件的数组循环的问题。 我有一个叫博客的盖茨比网页。js,在这个页面中,我展示了通过GraphQL检索到的博客标题。直接在博客中使用循环。我可以看到所有的标题。 我的blog.js圈是这样的 它从以下GraphQL查询中检索数据 而不是在博客中创建博客帖子预览。相反,我想使用一个组件来实现这一点。我创建了一个名为BlogPostRe

  • 我试图将类名传递给react组件以更改其样式,但似乎无法正常工作: 我试图通过传递具有各自风格的类的名称来改变药丸的风格。我是新来的,所以也许我做得不对。谢啦

  • 我想在我的组件中触发一个动作。这是一个表示组件,不需要重新创建。路由器实现是使用反应路由器冗余完成的。 main.js 应用:日新社: header.js: employee.js: action-creator.js: 道具将不包含动作,因为我没有将它绑定到道具上。我尝试在App.js中编写mapStateToProps和mapDispatchToProps,如下所示: 导出默认连接(mapSt

  • 问题内容: 我尝试将函数传递给子组件。当用户单击每个子组件时,将调用onclick函数。此onclick函数将写入父组件。 父组件: 子组件: 在这一行: 它说没有定义handleClick …如何解决这个问题? 感谢您的回答。 问题答案: 您需要将Agents绑定到AgentsList:这是您的代码的一个简单示例,我不得不删除一些东西,但是您明白了: http://jsfiddle.net/vh