在react组件之外访问redux存储的最佳方法是什么?

@connect当我尝试在react组件中访问商店时,它的工作效果很好。但是我应该如何通过其他一些代码来访问它。例如:假设我想使用授权令牌创建可以在我的应用程序中全局使用的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

现在,我想从我的商店访问一个数据点,这是如果我尝试使用以下方法在react组件中获取数据点的情况: @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() {...}
}

有任何见解或工作流程模式吗?

猪猪路易2020/03/11 10:59:46

用钩子做。我遇到了类似的问题,但是我在使用带有钩子的react-redux。我不想用很多专门用于从商店检索信息/向商店发送信息的代码来充实我的界面代码(即,对组件进行反应)。相反,我希望使用具有通用名称的函数来检索和更新数据。我的路径是将应用程序的

const store = createSore(
   allReducers,
   window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
 );

放入名为的模块store.jsexport然后const在store.js中添加常规的react-redux导入,然后添加。文件。然后,我index.js在应用程序级别导入,然后使用通常import {store} from "./store.js"的子组件导入index.js。然后,子组件使用useSelector()useDispatch()钩子访问商店

为了使用非组件前端代码访问商店,我使用了类似的导入(即import {store} from "../../store.js"),然后使用store.getState()store.dispatch({*action goes here*})处理了商店的检索和更新(或向商店发送操作)。

飞云前端西门2020/03/11 10:59:46

好像Middleware是要走的路。
请参阅官方文档以及其发行版上的此问题

Jim理查德泡芙2020/03/11 10:59:46

您可以使用storecreateStore函数返回的对象(应用初始化中的代码中应该已经使用了该对象)。比起您可以使用此对象来获取store.getState()方法的当前状态store.subscribe(listener)订阅商店更新。

您甚至可以将该对象保存到window属性,以在需要时从应用程序的任何部分访问它(window.store = store

可以在Redux文档中找到更多信息