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

// 问题来源  

众所周知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;
    }
}

 

posted @ 2020-07-07 18:08  饭饭大人  阅读(1002)  评论(0编辑  收藏  举报