在反应组件之外访问Reduce存储的最佳方式是什么?
当我尝试访问反应组件中的商店时,@ @connect
非常适用。 但是,我应该如何在其他一些代码中访问它。 例如:假设我想使用授权令牌来创build我的应用程序中可以全局使用的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() {...} }
任何见解或工作stream程模式?
从您称为createStore的模块中导出商店。 那么你放心,它将被创build,不会污染全球窗口空间。
MyStore.js
store = createStore(myReducer); export store;
要么
store = createStore(myReducer); export default store;
MyClient.js
import {store} from './MyStore' store.dispatch(...)
或者如果你使用默认
import store from './MyStore' store.dispatch(...)
find了解决办法。 所以我在我的api util中导入商店,并在那里订阅。 在这个监听器函数中,我使用新提取的令牌设置了axios的全局默认值。
这就是我的新api.js
样子:
// tooling modules import axios from 'axios' // store import store from '../store' store.subscribe(listener) function select(state) { return state.auth.tokens.authentication_token } function listener() { let token = select(store.getState()) axios.defaults.headers.common['Authorization'] = token; } // configuration const api = axios.create({ baseURL: 'http://localhost:5001/api/v1', headers: { 'Content-Type': 'application/json', } }) export default api
也许它可以进一步改善,因为目前看起来有点不雅观。 我后来可以做的是添加一个中间件到我的商店,然后设置令牌。
您可以使用从createStore
函数返回的store
对象(应用程序初始化中已经在您的代码中使用了该对象)。 您可以使用此对象获取当前状态,使用store.getState()
方法或store.subscribe(listener)
来订阅存储更新。
你甚至可以安全的这个对象window
属性访问它的任何部分的应用程序,如果你真的想要它( window.store = store
)
更多信息在这里
似乎Middleware
是要走的路。
请参阅官方文档和这个问题的回购
对于TypeScript 2.0,它看起来像这样:
MyStore.ts
export namespace Store { export type Login = { isLoggedIn: boolean } export type All = { login: Login } } import { reducers } from '../Reducers' import * as Redux from 'redux' const reduxStore: Redux.Store<Store.All> = Redux.createStore(reducers) export default reduxStore;
MyClient.tsx
import reduxStore from "../Store"; {reduxStore.dispatch(...)}