Разрешается ли выборка данных в файле App.js в приложении React? - PullRequest
0 голосов
/ 01 апреля 2019

Я встроил авторизацию в свое приложение React, используя passport.js, и мне хотелось бы, чтобы в моем файле App.js были получены маршруты авторизации, чтобы увидеть, вошел ли пользователь в приложение или никто не вошел в систему..

Чтобы помочь с этим вопросом, я поделился сжатой версией файла App.js моего приложения React и файла Index.js.

// App.js File

// Import React Libraries, Routes, Container Pages
import React, { Component } from 'react';
import { connect } from 'react-redux';
import { Route } from 'react-router-dom';
import { userActions } from './actions/auth/auth-actions.js';
import GameLanding from './containers/StatsPages/Game/GameLanding';
import AppFooter from './components/AppFooter';

// And Create The App
class App extends Component {
    constructor(props, context) {
        super(props, context);
    }

    componentDidMount() {
        this.props.dispatch(userActions.authorize());
    }

    render() {
        return (
            <div>    
                <Route exact path='/stats/games' render={() => <GameLanding userInfo={this.props.userInfo} />} />
                <AppFooter />
            </div>
        );
    }
}

// export default App;
function mapStateToProps(reduxState) {
    return {
        userInfo: reduxState.authorizedReducer.userInfo,
        authorized: reduxState.authorizedReducer.authorized,
        loading: reduxState.authorizedReducer.loading
    };
}

export default connect(mapStateToProps)(App);

... всего моего приложения.js-файл содержит ~ 15 компонентов Routes, и (моя часть) моя цель с моим файлом App.js - получить реквизиты authorized и userInfo и передать их компонентам по различным маршрутам.Я показал пример, где я передаю реквизит userInfo компоненту GameLanding.

Вот как я настроил свой файл Index.js.

// Index.js

// Import Libraries
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';

// Import CSS and the App
import App from './App';
import 'react-table/react-table.css';
import './index.css';
import './App.css';

ReactDOM.render(
    <Provider store={store}>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </Provider>,
    document.getElementById('root'));

Моя текущая проблеманапример: По какой-то причине загрузка реквизитов userInfo и authorized разрушает мое приложение.К сожалению, я не получаю сообщений об ошибках ... скорее, все ссылки реактивного маршрутизатора в моем приложении просто не работают ... щелчок по ним меняет URL, но страницы моего приложения больше не меняются ...

Тогда мои вопросы: (а) мне разрешено получать данные авторизации в App.js так, как я это делаю (используя connect, mapStateToProps и т. Д.), Или я все делаю неправильно?

Независимо от того, вошел ли кто-либо в мое приложение или нет, это вещь для всего приложения, а не для конкретной страницы, и я решил по этой причине (также для предотвращения необходимости извлекать реквизиты аутентификации во многих страницах-контейнерах)что App.js - лучшее место, чтобы взять эти реквизиты.

Будем весьма благодарны за любые мысли о том, почему мое приложение ломается или как должен выглядеть мой файл App.js (я уверен, что мой index.js в порядке на 99%)!Спасибо!

Редактировать: Для справки выполните следующие действия: (i) импорт userActions, (ii) вызов userActions.authorize () в componentDidMount, (iii) включая mapStateToProps и подключитесь книжняя часть приложения и т. д. работает для загрузки реквизитов аутентификации в любой из моих компонентов контейнеранапример, если бы у меня был этот код в моем компоненте GameLanding, он не нарушает общеинформационные ссылки реакции-маршрутизатора-домена так же, как это происходит, когда этот код находится в App.js.Отсюда и название вопроса.Спасибо!

1 Ответ

1 голос
/ 01 апреля 2019

1) Причина взлома приложения:

Я предполагаю, что userInfo и авторизованные реквизиты будут неопределенными, так как компонент визуализируется изначально до запуска componentDidMount, и вы не обработали неопределенные реквизиты. Вы также можете передать реквизиты по умолчанию для этих реквизитов.

2) Лучшая структура для авторизации Я предполагаю, что вам нужно аутентифицировать каждый маршрут для авторизации.

i) Создайте файл маршрутов и введите все маршруты для вашего приложения.

ii) <Route exact path='/stats/games' component={GameLanding} onEnter={reqAuth}/>

Внутри функции reqAuth вы должны проверить, авторизован ли пользователь для этого маршрута или нет.

iii) Внутреннее действие вызова компонента приложения для извлечения данных, сохранения в хранилище и использования GameLanding в качестве дочернего компонента и передачи пропуска только тогда, когда они определены.

Это не весь код, но должен дать вам суть.

Счастливое кодирование !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...