管理员仪表板设置:
// React modules
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { browserHistory } from 'react-router';
import { progressDone } from 'utils/nprogress-func';
// Admin Header section
import AdminHeader from '../admin-header/admin-header';
// Admin dashboard styling
import './styles/admin-dashboard';
class AdminDashboard extends Component {
componentDidMount() {
progressDone();
}
componentDidUpdate() {
if(!localStorage.getItem('admin_log_toks')) {
browserHistory.push('/admin-login');
}
}
render() {
if(this.props.isAuthenticated) {
return (
<div className="admin-dashboard">
{/* admin-bg class has been styled in main.scss */}
<div className="admin-bg"></div>
<AdminHeader />
<main>
<div className="admin-content-wrapper">
{this.props.children}
</div>
</main>
</div>
);
} else {
browserHistory.push('/admin-login');
return (
<div></div>
);
}
}
}
// These props come from the application's
// state when it is started
function mapStateToProps(state) {
const { authAdmin } = state;
const { isAuthenticated } = authAdmin;
return {
isAuthenticated
};
}
export default connect(mapStateToProps)(AdminDashboard);
我有一个带有导航菜单的管理仪表板。
<AdminHeader />
由路由到各个管理部分并使用 AdminDashboards 加载的菜单组成{this.props.children}
。
我通过登录表单进入管理仪表板,并调度了一个将变量 isAuthenticated 设置为 true 的操作。isAuthenticated 然后在成功登录时通过 reducer 对所有组件可用。isAuthenticated 是根据从服务器接收到的令牌设置的,然后将令牌存储在浏览器的 localStorage 中。
但是,我还想检查如果用户从 localStorage 中删除令牌会发生什么。
我已经设置
funtion auth (state = {
isAuthenticated: localStorage.getItem('token') ? true : false
})
现在,如果用户手动删除了 localStorage,那么在刷新时用户会被发送回登录屏幕。但是,我正在开发一个单页应用程序,并且我想确认每当用户路由到另一个路由/url而不刷新时,localStorage 中的令牌仍然存在。
因此,我写了这段代码:
componentWillReceiveProps() {
if(!localStorage.getItem('admin_log_toks')) {
browserHistory.push('/admin-login');
}
}
但是,我收到错误Uncaught Invariant Violation: findDOMNode was called on an unmounted component。
所以我把它改成:
componentWillUpdate() {
if(!localStorage.getItem('admin_log_toks')) {
browserHistory.push('/admin-login');
}
}
我仍然得到同样的错误。所以,我把上面的代码改成:
componentWillUpdate() {
if(!localStorage.getItem('admin_log_toks')) {
setTimeout(function() {
browserHistory.push('/admin-login');
}, 10);
}
}
一切正常,但由于某种原因,我认为这不是正确的方法。
我首先尝试在路线更改时解决此问题:
browserHistory.listen(location => {
if(!localStorage.getItem('admin_log_toks')) {
browserHistory.push('/admin-login');
}
})
但是,只需更改一次路线,listen 就会触发两次或三次。
上面的代码是正确的,还是有更好的解决方法?基本上,如果有人从 localStorage 中手动删除令牌,我只想路由登录。
我正在使用最新版本的 React、React 路由器、Redux 和 React redux。
感谢期待。