#reactjs #typescript #react-context #redux-persist
#reactjs #typescript #контекст реагирования #переопределение-сохраняется
Вопрос:
Я хочу сохранить единственный экземпляр класса api manager третьей стороны в моем приложении react.
Я пытаюсь достичь этого, используя Api контекста React, подобный этому:
Контекст Api:
import * as React from "react";
import { ApiManager } from "../ApiManager";
const defaultValue = new ApiManager()
const ApiContext = React.createContext(defaultValue);
const ApiProvider = ApiContext.Provider;
const ApiConsumer = ApiContext.Consumer;
const withApi = (enhanced) => {
return (
<ApiConsumer>
{api => enhanced }
</ApiConsumer>
)
}
export default ApiContext;
export {ApiContext, ApiProvider, ApiConsumer, withApi};
в моем клиенте я бы сделал что-то вроде этого:
const api = новый APIManager({ хост: apiHost, baseUrl: apiBaseUrl, ключ: apKey, sessionToken: persistedSessionToken });
ReactDOM.hydrate(
<Provider store={store}>
<PersistGate loading={<h1>loading...</h1>} persistor={persistor}>
<BrowserRouter>
<ApiProvider value={api}>
<Main />
</ApiProvider>>
</BrowserRouter>
</PersistGate>
</Provider>, document.querySelector('#app')
);
У меня есть 3 вопроса:
- Имеет ли это вообще смысл?
- Как бы я установил sessionToken, если он будет обновлен пользователем?
- Как мне повторно увлажнить экземпляр api после перезагрузки страницы с помощью
redux-persist
?
Ответ №1:
- Если вы просто хотите использовать один экземпляр
ApiManager
, то я не думаю, что вам нужен Context API. Просто создайте экземпляр и экспортируйте / импортируйте его в файлы, где вам это нужно. - Вы можете обернуть этот сторонний менеджер api, чтобы добавить некоторые необходимые вам методы, например,
setSessionToken
для установки / обновленияsessionToken
при загрузке приложения или когда пользователь получает / обновляет его. - Зачем беспокоиться
redux-presist
в этом случае (даже если вы решите использовать Context API), если Redux не задействован. Если вы хотите сохранить,sessionToken
поэтому сохраните его вlocalStorage
или любом другом хранилище, которое вы хотите, у него есть простой API для установки / извлечения значений, вам не нужно использовать библиотеку для этого.