requireAuth与react-router v4和redux
问题描述:
我有HOC检查是登录用户。requireAuth与react-router v4和redux
import React from 'react';
import { Redirect } from 'react-router-dom';
export default function requireAuthComponent(store, Component, redirectTo = '/') {
return class RequireAuthComponent extends React.Component {
render() {
const state = store.getState();
const auth = state.auth;
if (auth.logged) {
return <Component {...this.props} />;
}
return <Redirect to={redirectTo} />;
}
};
}
和路由
import PrivatContainer from './container/PrivatContainer';
import requireAuth from '../../components/requireAuth';
export default store => ({
path: '/privat',
exact: true,
component: requireAuth(store, PrivatContainer),
});
PrivatComponent
import React from 'react';
export default ({ auth: { logged }, toggleLogin }) => (
<div>
<h1>Privat Route</h1>
<h3>User is {logged.toString()}</h3>
<button onClick={() => toggleLogin()}>Logout</button>
</div>
);
当路由所有工作正常,但是当我改变存储与logged: false
,我还是留在此组件上先输入(线路)因为路由调用一次,而不更新商店更新,它如何修正或订阅RequireAuthComponent
对商店更新?
答
也许这是不正常的,所以如果你有更好的想法,请告诉我:)
export default function requireAuthComponent(store, Component, redirectTo = '/') {
return class RequireAuthComponent extends React.Component {
state = {
listener: null,
}
componentWillMount() {
const listener = store.subscribe(() => {
this.forceUpdate();
});
this.setState({ listener });
}
componentWillUnmount() {
const { listener } = this.state;
listener();
this.setState({ listener: null });
}
render() {
const state = store.getState();
const auth = state.auth;
if (auth.logged) {
return <Component {...this.props} />;
}
return <Redirect to={redirectTo} />;
}
};
}
+0
您可以使用“连接”功能将您的HOC组件连接到Redux。这样您就不需要手动订阅和取消订阅,并且您的组件将在状态更改时进行更改。如果您仍然需要示例,我可以将其作为答案发布。 –
我详细介绍了如何在[验证HOC]解释(https://*.com/questions/46379934/ react-router-v4-authorized-routes-with-hoc)可以被写入。如果您发现我的答案有用,请让我知道。 –