#reactjs #rest #express #http #redux
#reactjs #отдых #экспресс #http #redux
Вопрос:
У меня есть приложение react, которое использует сеансы с экспресс-сервером с использованием REST API. В моем хранилище Redux (на интерфейсе) Я сохраняю «isLoggedIn» в состоянии redux. На основе этого свойства я показываю либо страницу входа, либо домашнюю страницу. Теперь, когда я открываю веб-сайт, начальное состояние redux «isLoggedIn» равно false, поэтому вопрос в том, как мне проверить, действительно ли пользователь вошел в систему. Я подумываю об отправке запроса на конечную точку для получения нужных мне данных на домашней странице, и если пользователь не вошел в систему, я бы получил ответ 401, а затем показал страницу входа. Это правильный подход?
Ответ №1:
Прежде чем я расскажу, как вы могли бы сохранить свое состояние redux, я бы посоветовал (обратите внимание, что это личное мнение)
-
Просмотр кода котельной для его настройки действительно излишне длинный
-
Лучшим выходом для этого является использование экспресс-сеанса, при котором файл cookie сохраняется до тех пор, пока вы его предоставляете, например, если вы установили значение cookie равным 3 дням, он останется на 3 дня
-
Я так считаю, что это отраслевой стандарт, работающий с файлом cookie HttpOnly для обработки сеанса, поскольку это безопасно, избегая XSS-атак и CSRF-атак
В любом случае ниже приведено ваше решение для сохранения хранилища Redux
Итак, при сохранении вашего состояния redux вы можете посмотреть на что-то вроде этого
- Сначала запустите npm install redux-persist или yarn add redux-persist
Теперь пришло время создать свой магазин redux
Итак, теперь, когда вы создаете свой магазин redux с помощью createStore, вы хотите передать свою функцию persistReducer
createStore После создания вашего магазина, передайте его функции persistStore, которая гарантирует, что ваше состояние redux сохраняется
Реализация ниже
import { createStore } from 'redux';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage';
import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2';
import rootReducer from './reducers';
//Import above comes from a file **reducers** which has the combineReducers
// basically based on this code snippet
// I have my combineReducer object in another folder hope that it
//makes sense. Avoided to write it here to keep code short to show
//more of setup in store persisiting
const persistStoreConfigs = {
key: 'root',
storage: myAppStorage,
stateReconciler: autoMergeLevel2
};
const persistantReducer = persistReducer(persistStoreConfigs, rootReducer);
export const store = createStore(persistantReducer);
export const persistor = persistStore(store);
Теперь переходим из магазина на уровень приложения
import React from 'react';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/lib/integration/react';
// This are coming from the store code above that we made
import { persistor, store } from './store';
// This are basically your Custom Componentd
import { HomePage, LoadingView } from './components';
const App = () => {
return (
<Provider store={store}>
// the loading and persistor props are both required!
// Noting that the LoadingView is a custom component
// But the persistor isn't
//The main aim of this two props is to delay the rendering of your app UI until the persited state is retrieved hence the loading screen component
<PersistGate loading={<LoadingView />} persistor={persistor}>
<HomePage />
</PersistGate>
</Provider>
);
};
export default App;