Как настроить loader в react-router для проверки доступа без изменения логики внутри компонента?

Каким образом можно отобразить лоадер или ожидание до завершения проверки авторизации, не включая логику лоадера в компонент <About>? Как можно изменить компонент <About> таким образом, чтобы он перенаправлял на другую страницу, если проверка авторизации не пройдена?
  • 3 ноября 2023 г. 20:48
Ответы на вопрос 1
Один из способов настроить loader в react-router для проверки доступа без изменения логики внутри компонента - использовать компоненты высшего порядка (HOC) и контейнеры.

1. Создайте контейнер компонент (например, `AuthContainer`), который будет отвечать за проверку авторизации:
```jsx
import React, { Component } from 'react';
import { Redirect } from 'react-router-dom';

const AuthContainer = (WrappedComponent) => {
  class WithAuth extends Component {
    constructor(props) {
      super(props);
      this.state = {
        isAuthenticated: false,
        isLoading: true,
      };
    }

    componentDidMount() {
      // выполните здесь проверку авторизации
      // если проверка пройдена, установите isAuthenticated в true
      // если проверка не пройдена, перенаправьте на другую страницу
      // и установите isAuthenticated в false
    }

    render() {
      const { isAuthenticated, isLoading } = this.state;

      if (isLoading) {
        return <div>Loading...</div>; // отобразите loader
      }

      if (!isAuthenticated) {
        return <Redirect to="/login" />; // перенаправляем на другую страницу
      }

      return <WrappedComponent {...this.props} />;
    }
  }

  return WithAuth;
};

export default AuthContainer;
```

2. Используйте созданный контейнер `AuthContainer` для обертки компонента `About`:
```jsx
import React from 'react';
import AuthContainer from './AuthContainer';

const About = () => {
  return (
    <div>
      <h1>About</h1>
      <p>This is the About page.</p>
    </div>
  );
};

export default AuthContainer(About);
```

Теперь, компонент `About` будет автоматически проверять авторизацию при каждом монтировании и перенаправлять на другую страницу, если проверка не пройдена. Во время проверки, будет отображаться loader (в примере - "Loading...").
Похожие вопросы