Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mapDispatchToProps是否应调度初始化操作?_Javascript_Redux_React Redux - Fatal编程技术网

Javascript mapDispatchToProps是否应调度初始化操作?

Javascript mapDispatchToProps是否应调度初始化操作?,javascript,redux,react-redux,Javascript,Redux,React Redux,假设一个无状态、功能性的UserProfile组件显示给定url的用户数据。假设它是用connect(mapStateToProps,mapsDispatchToprops)(UserProfile)包装的。最后,假设一个reducer减少到state.userProfile。每当url更改时,我都需要重新初始化state.userProfile,因此想到的解决方案是从mapDispatchToProps中执行此操作,如下所示: function mapDispatchToProps(dispa

假设一个无状态、功能性的
UserProfile
组件显示给定url的用户数据。假设它是用
connect(mapStateToProps,mapsDispatchToprops)(UserProfile)
包装的。最后,假设一个reducer减少到
state.userProfile
。每当url更改时,我都需要重新初始化
state.userProfile
,因此想到的解决方案是从mapDispatchToProps中执行此操作,如下所示:

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

如果thunked fetchUser通过与当前状态比较来忽略重复调用,这是一种可接受的做法吗?或者,是否存在与立即从此映射函数调用dispatch相关的问题?

这是不受支持的,并且可能随时中断。
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,从而无法在其上运行单元测试。如果你要测试未连接的组件,它会丢失一些关于安装和卸载的逻辑。我不想争论。我非常感谢您的输入,但这一直是我在代码中不断重复的内容。在我的单元测试中,我不想测试“一点逻辑”。我希望无状态组件不知道从何处获取数据。我几乎希望有第三个map函数,它公开
连接的内部组件的生命周期事件。在这种情况下,您应该制作一个容器组件来进行提取,然后创建一个完全没有连接的表示组件。然后,就可以很容易地进行单元测试,而不需要任何逻辑,因为容器是唯一包含它的容器。所以不要理会它。