javascript - 如何在 React.JS 中有条件地添加路由?

标签 javascript reactjs firebase react-router firebase-authentication

我有一个带有 Firebase 的登录系统,如果有人输入正确的信息,我想动态添加路由,我希望它添加主路由和添加路由。

var userToken = 'firebase:authUser:AIzaSyDfC9LqfL1rbClhfCOD04BKC9ZIn7UAZ_g:[DEFAULT]';

ReactDOM.render(
    <Router history={hashHistory}>
        <Route path="/" component={Login} />
        <Route path="signup" component={Signup} />
         { localStorage.getItem(userToken) ? (
            <Route path="main" component={Main} />
          ) : (<Redirect from="main" to="/" />)
        }
        { localStorage.getItem(userToken) ? (
            <Route path="add" component={Add} />
          ) : null
        }  
        <Route path="main" component={Main} />
        <Route path="*" component={NotFound} />
    </Router>
    , document.getElementById('container'));

上面的代码工作正常,但它有一个缺陷,当有人输入正确的信息时,他们必须重新加载页面并再次输入信息才能登录。

有什么办法可以让他们在成功验证后不必重新加载页面吗?

最佳答案

我建议创建组件 SecureMainSecureAdd 并更新路由以使用它们。这些将检查用户 token 是否存在并呈现所需的内容,否则呈现您的 NotFound 组件。例如(请注意,我将其作为一个概念提出来,它可能并不完美):

import React from 'react';
import Main from './Main';
import NotFound from './NotFound';

export default class SecureMain extends React.Component {
  constructor(...args) {
    super(...args);
    this.state = { token: localStorage.getItem(userToken) };
  }
  render() {
    if (this.state.token) return <Main {...this.props} />;
    else return <NotFound {...this.props} />;
  }
}

这使得您的应用程序的状态更容易根据其状态进行预测。

当然我也必须附和@ZekeDroid关于客户端“安全”的免责声明:

client-side security IRL

关于javascript - 如何在 React.JS 中有条件地添加路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40978250/

相关文章:

css - 很难获得 Li 父元素的宽度,子元素不能继承宽度?

firebase - Firestore可以使用一个查询更新多个符合条件的文档吗?

ios - 无法访问 Firebase 子项

node.js - 使用 admin sdk 在云功能中执行 Firestore 集合组查询?

javascript - 在 div 中发布表单

javascript - Nodejs 将连接的套接字保存在房间上

reactjs - 未为 deepLink 调用 useEffect 中的函数

javascript - 主干集合仅触发解析或重置,我想我两者都需要

javascript - Angular UI-Grid 条件着色选择

javascript - 如何在 React + Material-UI 元素中使用 CSS?