Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
如何在Redux中使用规范化状态?_Redux_Normalizr - Fatal编程技术网

如何在Redux中使用规范化状态?

如何在Redux中使用规范化状态?,redux,normalizr,Redux,Normalizr,我需要帮助设计一个简单的应用程序,它允许用户使用表单对视频进行评分。我的状态由2个还原器组成,一个保存所有可分级视频的数据(以规范化方式),另一个保存表单状态: { videos: { 'video1Id': { id: 'video1Id', title: 'Cat video', duration: 120, ... }, 'video2Id': { ... }, ... }, rateForm: { 'videoId': 'video1Id'

我需要帮助设计一个简单的应用程序,它允许用户使用表单对视频进行评分。我的状态由2个还原器组成,一个保存所有可分级视频的数据(以规范化方式),另一个保存表单状态:

{
  videos: {
    'video1Id': { id: 'video1Id', title: 'Cat video', duration: 120, ... },
    'video2Id': { ... },
    ...
  },
  rateForm: {
    'videoId': 'video1Id'
    'userComment: 'A nice video about cat'
    'formSubmitted': false
    ...
  }
}
注意,在rateForm中,我引用的是视频id而不是视频对象。问题是,如何从rateForm reducer检索整个视频对象

我觉得我在遵循Redux设计的最佳实践,但我被困在这个非常简单的用例中。谢谢你的帮助


谢谢

记住一件事,减速器应该尽可能简单。仅在还原级别执行原子操作。从我所能告诉你的,试图在你的减速机中检索整个视频对象听起来是不对的

根据您的需要,如果您只想对整个视频对象进行评论或评分,通常不需要获取整个视频对象。但是,如果你100%确信你必须这样做,那么一个好的地方就是你的行动。使用
Redux Thunk
,您将可以在返回Thunk之前访问整个state对象。范例

function doSomethingToVideo (videoId, something) {
  return (dispatch, getState) => {
    const video = getState().videos[videoId]
    // Do what ever 
    return somethingElse
  }
}
参考:Redux作者对类似问题的回答


您能否澄清“从rateForm reducer检索整个视频对象”的含义?你想什么时候做,为什么?是在您更新数据以响应某个操作时,还是在
mapState
函数中提取某个组件的数据时?我所说的“整个视频对象”是指
{id:'video1Id',title:'Cat video',duration:120,}
。我需要它在我的窗体reducer中提供我的窗体组件。例如,我想在表单中显示视频标题。根据@yujingz的问题-您是想在reducer函数中获取该值,还是检索该值以便在组件中使用?如果您要求在组件中获取它,您可以使用ID:
const video=state.videos[state.rateForm.videoId]在
mapState
函数中查找它;返回{video}。我希望将其放入减速器中,而不是组件@markeriksonSounds,就像你可能会问这个问题一样:。谢谢你的回答,我同意减速器的简单性原则。阅读Dan的答案,thunk解决方案似乎也是一种反模式。我感到困惑的是,我的用例看起来很简单,但如果没有反模式编码就无法实现。也许我的状态设计是错误的。你能再描述一下你想要达到的目标吗?就像视频上的评论或视频上的费率看起来您只是想在费率表页面中显示视频信息?如果是这种情况,您可以从rateFrom容器映射您的状态。参见container:我在博客中回应了Dan关于“thunk是一种反模式”的评论。TL;Dan夸大了一些事情,这让很多人感到困惑,使用thunks并不坏,在thunks中访问状态也不坏。此外,减缩器不必“尽可能简单”。拥有非常复杂的reducer逻辑完全可以,只要它最终以不变的方式应用更新。