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函数,它公开连接的内部组件的生命周期事件。在这种情况下,您应该制作一个容器组件来进行提取,然后创建一个完全没有连接的表示组件。然后,就可以很容易地进行单元测试,而不需要任何逻辑,因为容器是唯一包含它的容器。所以不要理会它。