社区首页 >问答首页 >React (w/ react redux)缓存选项

React (w/ react redux)缓存选项
EN

Stack Overflow用户
提问于 2018-02-22 02:24:14
回答 3查看 2.9K关注 0票数 4

我正在构建一个应用程序,用户可以在其中登录并查看一些统计数据。

每个stat都是一个API调用的结果--想想一个有几个列的表,每个列都包含一个stat (只是一个数字)。

我注意到,每当组件被重新呈现时,API调用就会再次进行。这有主要的性能问题,因为可能需要几毫秒的时间才能显示stat。我如何:

( a)缓存此信息,使其持续存在,不需要在每次呈现时重新调用,b)使应用程序“知道”何时重新调用API,因为数据库中的stat已更新?

我目前正在使用Redux存储更明显的东西,比如用户正在查看的活动,但是有一个更好的方法来缓存这些统计数据,而不是为每个用户创建操作和还原器?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-22 10:19:19

因为我正在使用Redux,所以这个问题的答案并不像我所希望的那么简单。利用上面的答案,我想出了解决办法。

首先,当组件挂载时,它执行一个API调用,然后触发一个动作,然后是还原器,然后更新存储。

其次,我像这样使用shouldComponentUpdate

代码语言:javascript
代码运行次数:0
复制
shouldComponentUpdate(nextProps){
    if(nextProps.value){
        return true
    }
    if(this.props.value){
        return false;
    }
    return true;
}

如果组件具有nextProps,则重新呈现.如果它已经有一个值,不要重新呈现,如果它没有(有道具)呈现。

我仍然使用componentDidMount()调用API,每次使用组件时都会有效地侦听,而呈现(或不呈现)的决定则由shouldComponentUpdate()方法做出。

票数 0
EN

Stack Overflow用户

发布于 2018-02-22 02:42:34

( a)为了将数据缓存到localStorage中,Dan (redux的作者)观看这个视频

( b)为避免组件的重登,请使用shouldComponentUpdate

代码语言:javascript
代码运行次数:0
复制
shouldComponentUpdate(nextProps, nextState) {
  /**If no change in state return false*/
  return this.state.value != nextState.value;
}

这样你就可以停止不需要的再轮回了。

票数 3
EN

Stack Overflow用户

发布于 2018-08-10 21:50:02

本质上,您需要处理redux减速器中的每个获取操作。这就是为什么(在实现了几次缓存之后),我决定发布一个库(redux-缓存-api-中间件),专门为在这种情况下提供帮助而设计的(在redux-api中间件上它是一个很薄的包装)。您只需为每个请求考虑唯一的缓存密钥即可。

下面是一个示例组件,它从API中获取项并使用10分钟的缓存策略(这意味着如果您试图在缓存有效时调用API,那么它只会从缓存中返回数据):

代码语言:javascript
代码运行次数:0
复制
import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import api from 'redux-cached-api-middleware';
import Items from './Items';
import Error from './Error';

class ExampleApp extends React.Component {
  componentDidMount() {
    this.props.fetchData();
  }

  render() {
    const { result } = this.props;
    if (!result) return null;
    if (result.fetching) return <div>Loading...</div>;
    if (result.error) return <Error data={result.errorPayload} />;
    if (result.successPayload) return <Items data={result.successPayload} />;
    return <div>No items</div>;
  }
}

ExampleApp.propTypes = {
  fetchData: PropTypes.func.isRequired,
  result: PropTypes.shape({}),
};

const CACHE_KEY = 'GET/items';

const enhance = connect(
  state => ({
    result: api.selectors.getResult(state, CACHE_KEY),
  }),
  dispatch => ({
    fetchData() {
      return dispatch(
        api.actions.invoke({
          method: 'GET',
          headers: { Accept: 'application/json' },
          endpoint: 'https://my-api.com/items/',
          cache: {
            key: CACHE_KEY,
            strategy: api.cache
              .get(api.constants.CACHE_TYPES.TTL_SUCCESS)
              .buildStrategy({ ttl: 10 * 60 * 1000 }), // 10 minutes
          },
        })
      );
    },
  })
);

export default enhance(ExampleApp);

库的设置如下:

代码语言:javascript
代码运行次数:0
复制
import { createStore, combineReducers, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { apiMiddleware } from 'redux-api-middleware';
import api from 'redux-cached-api-middleware';
import reducers from './reducers';

const store = createStore(
  combineReducers({
    ...reducers,
    [api.constants.NAME]: api.reducer,
  }),
  applyMiddleware(thunk, apiMiddleware)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48924982

复制
相关文章
如何在Chrome浏览器中运行Selenium?
测试系统是一项艰巨的任务,您需要一个可以在此过程中为您提供帮助的工具。Selenium就是这样一种工具,主要用于网站测试。在本文中,我将告诉您如何在Chrome浏览器中运行Selenium。
用户8460142
2023/07/07
5790
如何在Chrome浏览器中运行Selenium?
quartus ii运行错误_安装quartus时弹出错误
Info: ******************************************************************* Info: Running Quartus II 64-Bit Analysis & Synthesis Info: Version 11.0 Build 157 04/27/2011 SJ Full Version Info: Processing started: Thu May 15 13:09:59 2014 Info: Command: quartus_map –read_settings_files=on –write_settings_files=off simulate -c simulate Info: Parallel compilation is enabled and will use 2 of the 2 processors detected Info: Found 1 design units, including 1 entities, in source file simulate.v Info: Found entity 1: modelsim_test Error: Top-level design entity “simulate” is undefined
全栈程序员站长
2022/11/04
5.1K0
quartus ii运行错误_安装quartus时弹出错误
selenium自动化测试时,chrome 出现“Chrome 正受到自动测试软件的控制”的解决办法
问题:使用selenium自动化测试的时候,启动浏览器出现‘Chrome正在受到自动软件的控制’的问题,修改方法有两种。
测试小兵
2019/11/20
7.5K0
Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
正常情况是在根目录下放置驱动,而且改名就识别不了了,如果偶尔换个别的版本浏览器,需要重新放置个合适的浏览器驱动把之前的替换掉,很是麻烦。 通过指定驱动后面就可以实现我把很多浏览器版本的驱动都放指定位置,后面可以写个遍历驱动的方法,如果这个驱动不适用就换另一个驱动,这样就可以在频繁更换浏览器版本的情况下正常运行我们的自动化了。
小蓝枣
2020/09/24
2.1K0
Python+Selenium 自动化-指定chrome驱动运行selenium实例演示,运行指定位置下的浏览器驱动
chrome浏览器对应驱动_chrome手机浏览器
chrome浏览器驱动下载地址:http://chromedriver.storage.proxy.ustclug.org/index.html
全栈程序员站长
2022/08/03
1.3K0
chrome浏览器对应驱动_chrome手机浏览器
忘记密码时,如何查看之前Chrome浏览器保存的密码
  日常当我们忘记密码时,如何查看之前Chrome浏览器保存的密码:   进入URL: chrome://settings/passwords   将 Saved passwords 选项里面的密码状态设置为 show   即可看到在该浏览器上保存的所有账号密码,以及该账户同步的所有账号密码 ---- ----
JNingWei
2018/09/28
3.2K0
Android经常使用的五种弹出对话框[通俗易懂]
  一个Android开发中经常使用对话框的小样例,共同拥有五种对话框:普通弹出对话框,单选对话框,多选对话框,输入对话框及进度条样式对话框:
全栈程序员站长
2022/02/01
2.3K0
Google 浏览器:Chrome
很久之前就有传闻说 Google 会推出浏览器,但是一直没有实际的东西流出。但是 Google 总是以出人意外的方式推出新产品,让大家免费为他宣传,这次以漫画书的方式来个预告,展示了 Chrome 的细节,并且很快今天今天就推出 beta 版。 🙂 当然我也很快下载使用。 Google Chrome 是 Google 最新推出的一款开源浏览器,目前只有 Windows 版本,但是很快会推出 Mac 和 Linux版本。Chrome 借鉴了苹果的 WebKit(Safari 浏览器使用的引擎)、Mozilla
Denis
2023/04/14
8680
Google 浏览器:Chrome
【玩转腾讯云】购买Windows CVM时自动安装Chrome、Firefox浏览器
Server2022之前的server系统默认是IE浏览器,微软已经不再支持IE了,所以新购的服务器安装一个好用的浏览器很关键。
Windows技术交流
2022/12/20
2.4K0
asp.net弹出层实例
源代码地址:http://download.csdn.net/detail/yayun0516/8264489
全栈程序员站长
2022/07/05
1.4K0
asp.net弹出层实例
关于selenium 运行chrome时,出现错误信息 -ignore certificate errors
后面偶然看到可能和chromedriver的版本有关系,我使用的chrome的版本是65,
Mokwing
2020/09/08
1.3K0
Google发布Chrome浏览器
不过整个界面的风格和细节把握的比较好,符合G的一贯风格,其他的功能不说,单单对任务管理器的一个统计做了一个比较,分别打开IE7\FF3\Opera\Chrome,在任务管理器里查看各自的内存占用情况,每个浏览器只打开一个google的首页,看到了什么:
大江小浪
2018/07/25
6420
Google发布Chrome浏览器
chrome浏览器架构学习
在从事前端开发过程中,浏览器作为最重要的开发环境,浏览器基础是前端开发人员必须掌握的基础知识点,它贯穿着前端的整个网络体系。对浏览器原理的了解,决定着编写前端代码性能的上限。一起学习下谷歌浏览器的架构知识。 谷歌浏览器运行时的四个主要进程
薛定喵君
2019/11/05
8840
WSL运行Chrome Headless模式
Google Chrome早就支持了headless模式,但一般都是在Linux上运行,而我则习惯于在WSL上开发,折腾了好久终于找到了可以在WSL上跑headless模式的方法。
drunkdream
2020/01/02
4.5K1
WSL运行Chrome Headless模式
ride运行报错_chrome OS
http://chromedriver.storage.proxy.ustclug.org/index.html 下载地址,注意需要与chrome版本对应
全栈程序员站长
2022/11/16
5700
ride运行报错_chrome OS
Chrome浏览器模拟手机浏览器
很多网站都通过User-Agent来判断浏览器类型,如果是3G手机,显示手机页面内容,如果是普通浏览器,显示普通网页内容。谷歌Chrome浏览器,可以很方便地用来当3G手机模拟器。 方法一: 点击左边的...
似水的流年
2020/05/26
10K0
Chrome浏览器模拟手机浏览器
窃取Chrome浏览器密码
全称Data Protection Application Programming Interface,Windows系统的一个数据保护接口,主要用于保护加密的数据,常见的应用如:
Gh0st1nTheShel
2021/11/23
1.6K0
chrome浏览器设置编码
今天写jsp文件,在chrome浏览器打开后,出现了乱码,平时在别的浏览器里,随随便便就能找到设置编码的选项,但在chrome浏览器里找了半天也没找到,以前我记得还可以设置的,无奈,只能找别的解决办法了。
秃头哥编程
2019/06/04
4K0
chrome浏览器设置编码
Python+selenium 自动化-操作已启用的chrome浏览器实例演示,chrome启用调试端口方法
首先在 chrome 快捷方式的目标后面加上这个参数。 前面是代表调试端口,可以随便用端口,后面指向一个新的文件夹用于存储用户数据。 注: 后面的参数如果不加上,端口启用好像会失败,目前没有找到原因。
小蓝枣
2020/09/24
1.6K0
Python+selenium 自动化-操作已启用的chrome浏览器实例演示,chrome启用调试端口方法
点击加载更多

相似问题

验证弹出chrome浏览器

13

当我使用浏览器运行自动测试时出错。如何运行它?

121

只有当弹出时才运行Chrome扩展脚本

13

Jenkins运行自动测试时出错

11

能用Protractor运行正常Chrome浏览器实例的匿名吗?

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文