【问题标题】:Should mapDispatchToProps dispatch initialization actions?mapDispatchToProps 是否应该调度初始化操作?
【发布时间】:2016-04-15 18:14:56
【问题描述】:

假设有一个无状态的功能性UserProfile 组件,它显示给定url 的用户数据。假设它被connect(mapStateToProps, mapDispatchToProps)(UserProfile) 包裹。最后,假设有一个 reducer 可以归约为 state.userProfile。每当 url 发生变化时,我都需要重新初始化 state.userProfile,因此想到的解决方案是在 mapDispatchToProps 中这样做:

function mapDispatchToProps(dispatch, ownProps) {
  dispatch(fetchUser(ownProps.userId))
  return {
    ...
  }
}

假设 thunked fetchUser 通过与当前状态进行比较来忽略重复调用,这是可以接受的做法吗?或者从这个 map 函数立即调用 dispatch 是否有问题?

【问题讨论】:

    标签: javascript redux react-redux


    【解决方案1】:

    这是不受支持的,随时可能中断。
    mapDispatchToProps 本身不应有副作用。

    如果您需要调度动作以响应道具更改,您可以创建一个组件类并为此使用生命周期方法:

    class UserProfile extends Component {
      componentDidMount() {
        this.props.fetchUser(this.props.id)
      }
    
      componentDidUpdate(prevProps) {
        if (prevProps.id !== this.props.id) {
          this.props.fetchUser(this.props.id)
        }
      }
    
      // ...
    
    }
    

    【讨论】:

    • 如果它调用dispatch,它不是纯粹的——这是一个副作用。
    • 来自维基百科:“结果评估不会导致任何语义上可观察到的副作用”。调度是一个副作用,因为它会改变应用程序的全局(原子可变)状态。
    • 不发送 mapDispatchToProps 的另一个原因是您现在将组件完全耦合到 redux 并且无法在其上运行单元测试。如果您要测试未连接的组件,它将缺少有关安装和卸载的逻辑。
    • 我并不是要争论。我非常感谢您的输入,但这一直是我在代码中不断提及的内容。在我的单元测试中,我不想测试 that “一点逻辑”。我希望无状态组件不知道它从哪里获取数据。我几乎希望有第三个 map 函数,它可以从 connect 的内部组件中公开生命周期事件。
    • 那么在这些情况下,您应该制作一个可以进行提取的容器组件,然后再创建一个完全不连接的展示组件。然后很容易在没有那一点逻辑的情况下进行单元测试,因为容器是唯一包含它的容器。所以请忽略它。
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2016-11-28
    • 2017-12-02
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多