2016-05-03 81 views
8

当涉及到在REDX世界中执行任务的“正确”方式时,我有很多困惑。假设我有一个reducer,它拥有foos列表,并且这些foos可以完全加载服务器关于foo或仅部分加载的所有信息。REDX从状态获取项目或从服务器获取

在应用程序中,我有两个视图/状态,一个是我有一个foos列表,另一个是我查看单个foo的详细信息。

当我查看foo的详细信息时,我想通过几个阶段来确定是否需要从服务器获取哪些数据。这个决定过程是这样的:

1)我已直接导航到foo的详细信息视图。 Theres没有关于这个foo的redux存储,我想从服务器上检索关于foo的全套信息。

2)我在前面打,我检索有关foo的部分信息列表视图,当我查看详细信息查看我只想取我缺少的是富

3)我以前的附加信息看到一个项目的foo视图,所以我需要的信息已经在redux存储中,因此不需要从服务器获取任何其他内容。

现在忘记了redux存储中的数据将需要刷新(如果失效)这一事实。我很困惑我如何通过有条件地分派行动来实现这三件事情。我基本上想调度行动部分或完全检索数据并设置显示选定的项目。

当我在细节视图中时,我可以将foo从商店直接连接到道具如果我有我需要的所有信息。如果没有,我需要调度一个动作来完全或部分检索我的foo数据的附加数据。在这个动作的背后已经完成,reducer将完全完整的foo添加到我的状态foo的列表中,然后我想找到合适的并将其分配给组件的props/state。

虽然我理解了我需要实现的部分,但我不知道何时何地我应该完成此过程的每个部分。

为了方便起见,我们假设每个foo都有一个id,因此在我的状态下查找foo是由该id进行筛选。

希望这是有道理的,任何帮助的欢迎,并有任何常见的模式,这种“从本地状态缓存获取或回落到服务器,如果失踪”的概念。

克里斯

回答

4

可以异步行动的创建者中检查当前Redux的状态,然后有条件地更新状态。因此,无论何时您需要从服务器更新本地状态,请派遣操作创建者并让其处理决策。你可以在componentDidMount中这样做。如果您使用终极版咚,你可以这样传递当前的状态:

export default function fetchFooBar() { 
    return (dispatch, getState) => { 
     const state = getState(); 

     if (! state.foo.bar) { 
      // fetch and dispatch 
     } 
    } 
} 
+0

谢谢,我知道我可以在'componentDidMount'检查状态,然后有条件派遣如果它不存在。但是这个调度的结果会在我的状态中添加一个项目到列表中。我是否还需要注意对列表的更改,以便在添加项目时我有兴趣显示详细信息以便更新组件状态? – Owen

+0

假设你正在连接你的组件(使用'react'中的connect''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''¡您只需输出组件的'render'函数中可用的任何redux状态。那是你在找什么? –

+0

谢谢里克,是的,我认为如此,但似乎有可能发生的竞争条件问题。由于获取项目的请求是异步的,因此在装入组件并检查状态之前可能尚未完成,因此最终会派发另一个提取。当我所能做的只是检查状态时,你通常会做什么来确保请求已完成。你的状态会有一些“取/抓”类型的标志吗? – Owen