我正在使用Redux构建产品列表网格(如在电子商务网站主页中)。用户可以无限滚动,并在滚动时从服务器加载项目。对于下一批项目,还在空闲时间内进行抢占式提取。
我已将我的redux动作(部分)建模如下:
FETCH_PRODUCTS_REQUEST :在启动请求时调度
FETCH_PRODUCTS_SUCCESS :在先前的请求成功时调度
在中间 LOAD_PRODUCTS 期间,我可以设置超时以分派 FETCH_PRODUCTS_REQUEST ,以便抢先获取下一批的项目集。
但是,我不完全确定如何在初始页面加载时(即,在安装ProductGrid组件时)同步这些操作。理想情况下,我希望在组件装载上发送 FETCH_PRODUCTS_REQUEST ,然后等待 FETCH_PRODUCTS_SUCCESS 发生,然后发送 LOAD_PRODUCTS 。
考虑到Redux中的单向数据流,我不清楚如何确定初始 FETCH_PRODUCTS_SUCCESS 已被触发(即我的商店有抢先数据),然后才能发送 LOAD_PRODUCTS 将此数据呈现到DOM上。
我正在使用 redux-saga 库来发送异步操作。
任何帮助将不胜感激!
答案 0 :(得分:1)
一种天真的方法是存储应用程序的初始化状态。
例如:
function initialized(state = false, action) {
switch (action.type) {
case FETCH_PRODUCTS_SUCCESS:
return true;
default:
return state;
}
}
最初加载页面时会false
,并在第一次成功的产品请求后切换到true
。
答案 1 :(得分:0)
这里的关键是ProductGrid
组件知道它调度的FETCH_PRODUCTS_REQUEST
是否是初始化操作(它发生在componentDidMount
内)。我添加了一个isInitial
标志作为动作有效负载的一部分。然后,redux-saga中间件可以查看此值,然后决定是否必须在接收LOAD_PRODUCTS
时调度FETCH_PRODUCTS_SUCCESS
(这是因为redux sagas基于生成器,因此一旦结果由在异步API中,传奇可以通过基于动作标志发送相应的动作来响应。