【问题标题】:requireAuth with react-router v4 and redux带有 react-router v4 和 redux 的 requireAuth
【发布时间】:2018-03-31 18:29:20
【问题描述】:

我有 HOC 用于检查是否已登录用户。

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),
});

私有组件

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 更改存储时,我仍然停留在这个组件(路由)上,因为路由调用一次并且不更新存储更新,它如何修复或订阅@ 987654326@商店更新?

【问题讨论】:

  • 我详细解释了如何编写Auth HOC。如果您觉得我的回答有用,请告诉我。

标签: javascript reactjs redux react-router react-router-v4


【解决方案1】:

也许它不正确,所以如果你有更好的主意,请告诉我:)

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} />;
    }
  };
}

【讨论】:

  • 您可以使用“连接”功能将您的 HOC 组件连接到 Redux。这样您就不需要手动订阅和取消订阅,并且您的组件将在状态更改时更改。如果您仍然需要示例,我可以将其发布为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2017-09-21
  • 2018-07-16
  • 2018-11-30
相关资源
最近更新 更多