Reactjs 已连接组件中的Throttle MapStateTops调用
我有一个React应用程序,它带有一个Redux存储,连接到websocket并在表中向用户显示信息。我有一个RxJs中间件,它连接到websocket并用内容发送操作。然后在减速器中取出,保存到我所在的州。然后,我映射StateToprops以显示React组件中的数据Reactjs 已连接组件中的Throttle MapStateTops调用,reactjs,redux,react-redux,rxjs,Reactjs,Redux,React Redux,Rxjs,我有一个React应用程序,它带有一个Redux存储,连接到websocket并在表中向用户显示信息。我有一个RxJs中间件,它连接到websocket并用内容发送操作。然后在减速器中取出,保存到我所在的州。然后,我映射StateToprops以显示React组件中的数据 问题是更新的速度比渲染的速度快。我可以每秒更新50次,如果每次数据进入我的应用程序时我都进行渲染,那么我的应用程序性能将非常糟糕。我需要一种方法来限制调用mapStatetoProps的次数。我有很多组件映射到这个状态,现在我
问题是更新的速度比渲染的速度快。我可以每秒更新50次,如果每次数据进入我的应用程序时我都进行渲染,那么我的应用程序性能将非常糟糕。我需要一种方法来限制调用mapStatetoProps的次数。我有很多组件映射到这个状态,现在我在shouldComponentUpdate中为每个组件设置了1秒的节流。如果我可以在较低的级别上设置每秒一次的油门,以避免在我的每个组件上都有重复的逻辑,那就更好了。我也不能删除每秒收到的50条消息中的任何一条,而只获取最近的消息,因为用户需要的数据分布在每条消息中。有什么想法吗?问题是redux存储每秒更新50多次,因此组件每秒渲染50多次。您只希望存储每n秒更新一次,但不会丢失任何数据。这是高频数据中的常见问题;通常,解决方案是使用缓存 因此,您需要缓存结果,然后每隔
n
秒将缓存的消息推送到消息数组中,然后清除缓存
它看起来像这样
your_websocket.on("new_message", message =>
dispatch({ action: "ADD_TO_CACHE", message })
);
setInterval(() => {
dispatch({ action: "PUSH_CACHE_TO_STATE" });
}, 1000);
const your_reducer = (state, action) => {
/* -- snip -- */
case "PUSH_CACHE_TO_STATE":
newState.messages.push(...newState.messageCache);
newState.messageCache = [];
return newState;
case "ADD_TO_CACHE":
newState.messageCache.push(action.message);
return newState;
}
这将把每一条新消息推送到缓存中,然后每隔1000毫秒缓存将被清除并推送到redux存储中的消息数组中
然后,在您的组件中,您只需映射StateToprops,如下所示:
connect(store => ({ messages: store.messages }))(YourComponent);
并且您的组件只会在每次更新消息时(每秒一次)重新呈现。AFAIK您不能限制/取消取消取消状态到道具的映射,但您可以取消或“收集”已调度的操作以更新状态,基本上是从websocket发送一批更新,而不是试图单独发送一批更新。这主意不错。我将尝试类似的方法,看看是否有帮助。很好的解决方案,不过我认为
ADD_TO_CACHE
操作应该推入缓存数组,而不是messages数组newState.messageCache.push(action.message)代码>。由于它是一个减缩器,所以总是返回一个新的数组对象,即返回{…state,messageCache:[…state.messageCache,action.message]}代码>。但这段代码可能假设在reducer函数中全局创建了一个“newstate”对象,而不考虑操作。这是我的错别字。会改变的。