Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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
Reactjs React(Redux):检查是否已执行操作(服务器端呈现)_Reactjs_Redux - Fatal编程技术网

Reactjs React(Redux):检查是否已执行操作(服务器端呈现)

Reactjs React(Redux):检查是否已执行操作(服务器端呈现),reactjs,redux,Reactjs,Redux,我正在努力实现以下目标: 我的体系结构目前在初始请求上执行服务器端呈现,并解决所有在存储返回到客户端之前用数据填充存储的承诺 现在,它工作得很好,客户端将收到一个已填充的存储和视图。但它会再次触发动作(冗余) 我的理想场景是,服务器端呈现在结果中添加一个属性:“resolved:true”,这样您就知道初始请求来自服务器,可以删除冗余操作,将属性设置为false,并通过中间件返回该状态 目前,我添加了以下属性: { resolved: true, data: […] } 然后,我的中间件将需要

我正在努力实现以下目标:

我的体系结构目前在初始请求上执行服务器端呈现,并解决所有在存储返回到客户端之前用数据填充存储的承诺

现在,它工作得很好,客户端将收到一个已填充的存储和视图。但它会再次触发动作(冗余)

我的理想场景是,服务器端呈现在结果中添加一个属性:“resolved:true”,这样您就知道初始请求来自服务器,可以删除冗余操作,将属性设置为false,并通过中间件返回该状态

目前,我添加了以下属性:

{
resolved: true,
data: […]
}
然后,我的中间件将需要检查故事当前是否有此操作的数据,如果有,则不再次执行该操作并将resolved设置为false,以便下次到达此路由时,它将重新加载异步数据

 return (store) => (next) => (action) => {
 // check if action data is already on store 
 // check if resolved property is true?
 return next(action);
 }
我正在考虑使用redux中间件。但是,我无法确定我的操作返回的数据将映射到存储上的什么,因为reducer负责此操作

然而,我不相信中间件技术会起作用


关于如何解决这个问题,你有什么想法吗?

如果你真的想在你的中间件中这样做,你可以像下面那样使用store参数,但是我建议在action creator中进行检查

return store => next => action => {
    state = store.getState(); // current state

    if (state.resolved) {
        return next(action);
    }

    // do loading
    next(action);
};

我强烈建议看一看Redux示例;特别是。您将在action creators中看到,他在获取之前进行了一些基本的状态检查。

谢谢您的回答,我非常感谢。但我很确定,在现实世界的例子中,他没有说明已经初始化存储的服务器。我查看了代码,它似乎也会执行两次操作,一次是在渲染之前在后端执行,另一次是在屏幕上渲染时执行。我认为检查action creator内部也是一种更好的方法。但是,我需要在后端保留操作的历史记录,并将它们传递到前端,这并不理想?如果存储在服务器上初始化,为什么不将该状态发送到客户端?您可以在服务器上的createStore()和render()之间执行相同的调度等操作。当你的应用加载时,你的应用商店中应该有相同的状态。因此,当调用action creator时,getState()应该使用从服务器发送的状态,而不是从一张空白的石板开始。我确实将状态发送给了客户端,棘手的部分是告诉客户端不要在初始渲染时重新加载,我们是如何解决的,而不是将整个存储发送给客户端。我们编写了一个中间件,用于记录操作并将操作发送到客户端。基于客户端上的这些操作重建存储。然后通过thunk将已执行的标志和强制检查添加到动作创建者。我们还向操作添加了forceExecute标志。我们将forceCheck设置为true,并在渲染函数之后将其设置为false。这是一种解决方法,可以强制客户端不重新提交初始服务器加载。。。如果成功了,就成功了。目前,我只需调用服务器上的所有初始操作,然后在所有异步操作调度完毕后,将
store.getState()
发送到客户端。你们用的是什么堆栈?我们用的是:Redux,React,Webpack,React路由器,Node我正在写一篇关于它的文章,以及如何用这个同构堆栈处理服务器端渲染。如果你感兴趣的话,我会在我完成后给你发送链接?