@connect
прекрасно работает, когда я пытаюсь получить доступ к магазину в компоненте реакции. Но как мне получить к нему доступ в другом фрагменте кода? Например, скажем, я хочу использовать токен авторизации для создания моего экземпляра axios, который можно использовать в моем приложении в глобальном масштабе. Каков наилучший способ добиться этого?
Это мое api.js
// tooling modules
import axios from 'axios'
// configuration
const api = axios.create()
api.defaults.baseURL = 'http://localhost:5001/api/v1'
api.defaults.headers.common['Authorization'] = 'AUTH_TOKEN' // need the token here
api.defaults.headers.post['Content-Type'] = 'application/json'
export default api
Теперь я хочу получить доступ к точке данных из своего магазина, вот как это выглядело бы, если бы я пытался извлечь ее из компонента реакции, используя @connect
// connect to store
@connect((store) => {
return {
auth: store.auth
}
})
export default class App extends Component {
componentWillMount() {
// this is how I would get it in my react component
console.log(this.props.auth.tokens.authorization_token)
}
render() {...}
}
Есть идеи или шаблоны рабочего процесса?
reactjs
redux
react-redux
Субод Парик
источник
источник
api
inApp
и после получения токена авторизации вы можете это сделатьapi.defaults.headers.common['Authorization'] = this.props.auth.tokens.authorization_token;
, и в то же время вы можете сохранить его и в localStorage, поэтому, когда пользователь обновляет страницу, вы можете проверить, существует ли токен в localStorage, и если он Да, вы можете установить его. Я думаю, что будет лучше установить токен на модуль API, как только вы получите его.Ответы:
Экспортируйте магазин из модуля, с которым вы звонили
createStore
. Тогда вы уверены, что он будет создан и не будет загрязнять пространство глобального окна.MyStore.js
или
MyClient.js
или если вы использовали по умолчанию
Для нескольких случаев использования магазина
Если вам нужно несколько экземпляров магазина, экспортируйте фабричную функцию. Я бы порекомендовал сделать это
async
(возвращаяpromise
).На клиенте (в
async
блоке)источник
store.getState()
Нашел решение. Поэтому я импортирую магазин в своем утилите api и подписываюсь на него там. И в этой функции слушателя я установил глобальные значения по умолчанию для axios с помощью своего недавно извлеченного токена.
Вот как
api.js
выглядит мой новый :Может быть, это может быть улучшено еще больше, потому что в настоящее время это выглядит немного не элегантно. Что я мог сделать позже, так это добавить промежуточное ПО в мой магазин и установить токен тут же.
источник
store.js
выглядит ваш файл?Вы можете использовать
store
объект, возвращаемыйcreateStore
функцией (который уже должен использоваться в вашем коде при инициализации приложения). Чем вы можете использовать этот объект, чтобы получить текущее состояние с помощьюstore.getState()
метода илиstore.subscribe(listener)
подписаться на обновления магазина.Вы даже можете сохранить этот объект в
window
свойстве, чтобы получить к нему доступ из любой части приложения, если вы действительно этого хотите (window.store = store
)Более подробную информацию можно найти в документации Redux .
источник
store
дляwindow
Похоже,
Middleware
это путь.Ссылайтесь на официальную документацию и этот вопрос по их репо
источник
Как и @sanchit, предлагаемое промежуточное ПО будет хорошим решением, если вы уже определяете свой экземпляр axios глобально.
Вы можете создать промежуточное ПО, например:
И используйте это так:
Он будет устанавливать токен на каждое действие, но вы можете прослушивать только действия, которые меняют токен, например.
источник
Для TypeScript 2.0 это будет выглядеть так:
MyStore.ts
MyClient.tsx
источник
Это может быть немного поздно, но я думаю, что лучше всего использовать,
axios.interceptors
как показано ниже. URL-адреса импорта могут меняться в зависимости от настроек вашего проекта.index.js
setupAxios.js
источник
Делаем это с помощью крючков. Я столкнулся с подобной проблемой, но я использовал реактив-редукс с крючками. Я не хотел загружать свой код интерфейса (т. Е. Реагировать на компоненты) большим количеством кода, предназначенного для извлечения / отправки информации из / в магазин. Скорее я хотел функции с родовыми именами для извлечения и обновления данных. Мой путь должен был поставить приложение
в модуль с именем
store.js
и добавлениемexport
доconst
и добавлением обычного импортаact-redux в store.js. файл. Затем я импортировал вindex.js
на уровне приложений, которые я затем импортирован в index.js с обычнымimport {store} from "./store.js"
Дочерние компоненты затем доступ в магазин , используяuseSelector()
иuseDispatch()
крючки.Чтобы получить доступ к хранилищу в некомпонентном коде переднего плана, я использовал аналогичный импорт (т. Е.
import {store} from "../../store.js"
), А затем использовалstore.getState()
иstore.dispatch({*action goes here*})
для обработки поиска и обновления (т. Е. Отправки действий) хранилища.источник
Простой способ получить доступ к токену - это поместить токен в LocalStorage или AsyncStorage с React Native.
Ниже приведен пример с проектом React Native.
authReducer.js
и
api.js
Для веб вы можете использовать
Window.localStorage
вместо AsyncStorageисточник