繁体   English   中英

如何在 redux 中访问 mapDispatchToProps 中的全局状态?

[英]How do I get access to the global state in mapDispatchToProps in redux?

我想调度一个操作来更新我的应用程序的全局状态与当前登录的用户。 当用户单击按钮时,将触发在mapDispatchToProps注册的事件处理程序,然后我想调度一个操作( article.updateAuthor(currentUser) )。 但是,在mapDispatchToProps我无权访问获取当前用户的状态,并且我不想将当前登录的用户任意传递给组件道具——只传递给上面的点击事件,然后传递用户数据到一个分派的动作。

我知道我可以使用 redux thunk 发送一个动作,这让我可以访问状态。 但是,由于没有进行 API 调用,这似乎相当笨拙。

有没有人遇到过这个问题?

react-redux提供的connect函数中,您可以使用四个可选参数:

  • mapStateToProps
  • mapDispatchToProps
  • mergeProps (这个会给你你想要的)
  • options

mergeProps的文档中:

如果指定,则传递 mapStateToProps()、mapDispatchToProps() 和父道具的结果。 您从中返回的普通对象将作为道具传递给包装的组件。 您可以指定此函数以根据 props 选择状态的一部分,或将动作创建者绑定到 props 中的特定变量

因此,在您的情况下,您将使用mapStateToProps来访问您需要的全局状态的任何部分。 结果将作为stateProps参数传递给mergeProps

mergeProps做你需要对这个状态做的事情,使用dispatchProps的结果(或从它解构dispatch )并在你想要连接的组件中返回你需要的对象。

您可以考虑导入您的商店并使用store.getState() ,这样您就可以访问您的“全球”商店。

但请记住,不建议使用这种方法,如果您使用的是connect mergeProps按照@markerikson 回答的建议使用mergeProps

获取状态()

返回应用程序的当前状态树。 它等于 store 的 reducer 返回的最后一个值。 来源

伪代码:

import store from 'store'
store.getState().yourReducer.user.current

你不能。 mapDispatch故意不授予对状态的访问权限,因为您通常使用mapDispatch创建绑定函数,并且基于状态这样做会在状态更改时不断导致这些函数被重新创建。

如果你真的想这样做,你可以使用第三个参数connect ,称为mergeProps ,但这通常只能用作最后的手段。

推荐的方法是:

  • mapState提取相关数据,并让组件调用this.props.someFunction(this.props.someRelatedValue)
  • 使用 thunk 并访问那里的状态

总的来说,在 thunk 中访问状态是一种完全有效且受支持的功能。 有些人担心这样做是否是一个好主意,我在我的博客文章Idiomatic Redux: Thoughts on Thunks, Sagas, Abstraction, and Reusability 中解决了这些问题。

在 mapDispatchToProps 中无法访问状态是荒谬的。

redux 有一个替代方案, Dynadux ,它很简单,解决了 Redux 的繁琐。

此外,可以在没有 Thunk 的情况下从减速器中触发 ispatches。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM