关于react实现类似vue keep-alive 的cache router的功能解决方案

摘要:
React官方目前还没有发现类似于vue的keep-alive函数的api。互联网上有一些开源插件,所以我不敢使用它们。对于整个项目来说,使用一个奇怪的api来控制整个项目有点冒险。基于这个问题,我有一个相对优雅的解决方案:1.缓存当前的pageNo或tabNo,它不必存储在Redux中。因为react是一个单页应用程序,所以只需要添加pageNo,tabNo是在react页面的组件之外定义的。每次加载时,她只会重新加载react类,而不会重新加载外部数据。
// 问题来源  

众所周知react是单页面应用,在路由发生变化的时候,她所对应的页面或者组件会被卸载。当路由加载的时候,原页面所有的数据都会重新加载

这在移动端的用户体验可能是一个重大灾难!

比如列表滚动到第20页或者tab切换第三个tab 再去滚动列表进入详情页,当你返回的时候你原来的浏览记录被重新加载了,这个体验会是非常差。

react官方暂时未找到类似于vue的keep-alive功能的api,网上差了一些开源的插件,有点不太敢使用,对于整个项目来讲,使用一个陌生的api来控制整个项目,实在有点冒险。 基于这个问题,我这边有个相对而言稍微优雅的解决方案如下
1 缓存当前pageNo,或者tabNo,不一定要存储在redux当中,因为react是单页应用,你只需要加pageNo,tabNo定义在react页面组件之外即可,每次加载的时候,她只会重新加载react类,外部的数据不会重新加载。

2 有人会提出,将列表数据存储在redux中,试想一下如果业务复杂,那该是多大的代码量。

3 为此可以跟后端定义一些接口,比如我页面加载5页的数据,先缓存5这个页码,当返回重新加载的时候,可以直接全部拉取这5页的数据,并做相应的滚动,接下来滚动逻辑再按照分页逻辑去做。

4 此方案不是最优解,在我这实现的时候,稍微提升了用户体验。大家如果有意见的话,大可提出。
const pageNo = 0;
const tabNo = 0
const cacheId = null;



export default class A extends React.Componet {

    constructor(props){

    }

    pageNo = pageNo

    tabNo = tabNo;

    componetDidMount() {
        if(pageNo > 0) {
            this.getData(pageNo,()=>{
                swpier(cacheId)
            })
        }
    }


    onPageChange = (pageNo) => {
        pageNo = pageNo;
        this.pageNo = pageNo;
    }
}

免责声明:文章转载自《关于react实现类似vue keep-alive 的cache router的功能解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android.os.NetworkOnMainThreadException的解决方案【12c】Oracle Restart中的SRVCTL命令详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Vue后台管理三】集成echarts图表

集成echarts图标 路一步步走,代码得一个个敲,今天自己来集成了echarts图标,为什么要集成echarts了? 图表表示数据,应该是最清晰直白了,所以很多管理页面的首页都集成了。 首先看看效果 下面应该还有一个关于每月销量收入的图表,明天在加上。 站在巨人的肩膀上 我个人没真实做过后台管理项目,所以了这些后台的样子,是参考我公司后台管理样式和一些...

React Swiper轮播图(二)

目录 React Swiper轮播图(一) React Swiper轮播图(二) 需求 实现React可切换轮播图 效果预览 使用库 swiper官网 https://swiperjs.com/react npm i swiper@6.5.0 --save 实现方法 /** 导航 */ import React, { useState }...

vue element UI el-table 单元格中超出字省略号显示

filters: {     formatLongText(value) {     if(value===undefined||value===null||value===''){     return '暂无';     }else if(value.length>8){      return value.substr(0, 8...

Vue的插值与表达式

正常情况我们在页面取值都是通过 {{ data }}来取值,但是有时候我们就是想输出HTML,而不是将数据解析后的纯文本,这个时候可以使用v-html来绑定数据 <span v-html="link"> </span> <script> export default { data() { return...

vue后台(一)

一,项目准备工作 1.拿到已经是二次开发的代码, npm i , 安装依赖包 ES6模块暴露和导入复习 1. 导出方式一: 默认一次性导出 (只能有一个) export default xxx 本质: 整个模块是一个对象, 对象中有default属性, 即: {default: xxx} 2....

如何运行vue项目

转载:如何运行vue项目 目录(?)[-] 安装cnpm 安装vue-cli脚手架构建工具 用vue-cli构建项目 安装项目所需的依赖 运行项目 在师兄的推荐下入坑vue.js ,发现不知如何运行GitHub上的开源项目,很尴尬。通过查阅网上教程,成功搭建好项目环境,同时对前段工程化有了朦朦胧胧的认知,因此将环境搭建过程分享给大家。 首先,列...