reactjs - 限制连接组件中的 MapStatetoProps 调用
问题描述
我有一个带有 Redux 存储的 React 应用程序,它连接到 websocket 并在表格中向用户显示信息。我有 RxJs 中间件,它连接到 websocket 并使用内容调度操作。然后那些在减速器中被拾起并保存到我的状态。然后我 mapStateToProps 在我的 React 组件中显示数据。
问题是更新的速度比渲染的速度快。我每秒可以获得 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 存储中的消息数组中。
然后在您的组件中,您只需像这样 mapStateToProps :
connect(store => ({ messages: store.messages }))(YourComponent);
并且您的组件只会在每次更新消息时重新渲染(每秒一次)。
推荐阅读
- c++ - 对智能指针范围的困惑
- javascript - “PromiseLike”类型不存在属性“catch”
'在离子 - sql - MS Access - 通过多个连接表求和的查询
- apache-kafka - 这不是正确的协调员/不知道该成员的协调员
- php - Visual Studio Code PHP 调试器在远程调试时不会在断点处停止
- amazon-web-services - 无法创建预签名 URL 以从 eu-west-3 下载对象
- c - 创建代码以打印 3 个数字之间的最大值的问题
- sql - 如何从 SQL Server 删除 CSV 导出中填充的双引号
- python - 无法在 Django 中引用相关的多对多对象
- html - 浏览器密码管理器可以只记住用户名吗?