【问题标题】:react Maximum call stack size exceeded反应超出最大调用堆栈大小
【发布时间】:2016-06-29 12:26:05
【问题描述】:

如果用户未登录,我会尝试将用户重定向到“TrapPage”。

这是我的代码:

function requireAuth(nextState, replace) {
    if (!auth.loggedIn()) {
        replace({ 
            pathname:'/trap'
        })
    }
}

export default (
    <Route path="/" component={App} onEnter={requireAuth}>
        <IndexRoute component={DashboardPage} />
        <Route path="trap">
            <IndexRoute component={TrapPage}/>
        </Route>
        <Route path="accounts">
            <IndexRoute component={AccountPage}/>
            <Route path="add" component={AccountAdd} />
            <Route path="detail/:id" component={AccountDetail} />
        </Route>
        <Route path="contacts">
            <Route path="detail/:id" component={ContactPage}/>
        </Route>
        <Route path="transmissors">
            <Route path="detail/:id" component={TransmissorPage}/>
        </Route>
        <Route path="attends" component={AttendancePage} />
        <Route path="reports" component={ReportPage} />
        <Route path="configs" component={ConfigurationPage} />
    </Route>
);

当我将函数 requireAuth 放在 onEnter 时,控制台给了我一个错误:

Uncaught RangeError: Maximum call stack size exceeded

我是 React 的初学者,请耐心等待 :)

我的代码有什么问题?

【问题讨论】:

    标签: javascript reactjs stack-overflow react-router


    【解决方案1】:

    如果用户未登录,您需要在将用户重定向到的同一路由上进行身份验证。这会导致由于用户未登录而重定向用户的无限循环。也许从&lt;Route path="trap"&gt; 移出在需要身份验证的路由下方。

    另外,您的函数缺少第三个参数。

    function requireAuth(nextState, replace)
    

    应该是

    function requireAuth(nextState, replace, cb) {
    

    一旦你完成了认证逻辑,你需要像这样调用cb

    function requireAuth(nextState, replace) {
        if (!auth.loggedIn()) {
            replace({ 
                pathname:'/trap'
            });
        }
    
        cb();
    }
    

    这是一个回调函数,可以让路由流程继续进行。

    编辑:

    您可以这样重新组织您的路线:

    <Route path="/" component={App}>
        <IndexRoute component={DashboardPage} />
        <Route path="trap">
            <IndexRoute component={TrapPage}/>
        </Route>
        <Route onEnter={requireAuth}>
            <Route path="accounts">
                <IndexRoute component={AccountPage}/>
                <Route path="add" component={AccountAdd} />
                <Route path="detail/:id" component={AccountDetail} />
            </Route>
            <Route path="contacts">
                <Route path="detail/:id" component={ContactPage}/>
            </Route>
            <Route path="transmissors">
                <Route path="detail/:id" component={TransmissorPage}/>
            </Route>
            <Route path="attends" component={AttendancePage} />
            <Route path="reports" component={ReportPage} />
            <Route path="configs" component={ConfigurationPage} />
       </Route>
    </Route>
    

    然后根据您是否需要在仪表板上进行身份验证,您也可以将onEnter={requireAuth} 添加到该路由中。这会将需要身份验证的路由与不需要身份验证的路由分开。

    【讨论】:

    • 你对改变有什么建议吗?
    • @AlessanderFrança 我更新了我的答案,为您提供更多指导。
    • 好的,我在这里试试 :)
    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 2015-10-24
    • 2015-12-29
    • 2017-12-27
    • 2020-12-06
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多