javascript - react 超出最大调用堆栈大小

标签 javascript reactjs stack-overflow react-router

如果用户未登录,我会尝试将他重定向到“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 初学者,请耐心等待 :)

我的代码有什么问题?

最佳答案

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

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

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}也到那条路线。这会将需要身份验证的路由与不需要身份验证的路由分开。

关于javascript - react 超出最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099497/

相关文章:

javascript - 如何在 Safari 上平滑滚动(或等效)?

javascript - 如何防止由于不需要的递归而导致 IE 中的堆栈溢出

asp.net-mvc - 由 linq 查询引起的 StackOverflowException

java - 为什么可以从 StackOverflowError 中恢复?

javascript - 值得先检查一个元素是否存在?

javascript - reducer 更新了错误的值(数组更新了一个项目,里面只有很少的项目,而不是分散它们)

javascript - querySelectorAll 未选择所有元素

reactjs - Redux getState 在行动中不起作用

php - 许多许多 css 背景性能

javascript - 我可以使用动态 import() 表达式将 SVG 文件作为 react 组件导入吗?