react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置

现状:目前从商品详情页返回到商品列表页,还需要再去请求服务数据,还需要用户再去等待获取数据的过程,这样用户体验非常不好,

遇到的问题:

1:如何将数据缓存,

2:如何获取和保存列表滑动的高度,

3:判断商品列表页的上一个页面是什么?

如果是从搜索页进到商品列表页的话我们需要清除缓存,获取接口数据,

如果是商品详情页返回到商品列表页的话就用缓存数据,并且滑到到上次浏览的位置。

 一:数据缓存

 使用react全家桶reducers保存数据

1   dispatch({
2      type: types.PRODUCT_LIST,
3      productlist: oldList.concat(data.result),
4      totalPage: data.totalPage,
5      curPage: page,
6      totalCount: data.totalCount
7   });

二:获取和保存列表滑动的高度

 在商品列表页销毁方法里记录滑动高度

1     componentWillUnmount(){
2         var top = $(document).scrollTop();
3         window.sessionStorage.setItem("top",top);
4         window.sessionStorage.setItem("isUseCacheProductList",false);
5         
6     }

 

三:判断商品列表页的上一个页面是什么

在商品详情页离开时劫持路由,判断如果是去商品列表页的话,就设置标识为true。

以下每一步都很关键

商品详情页代码:

import {Router} from 'react-router'
Product.contextTypes = {
    store: React.PropTypes.object,
    router: React.PropTypes.object.isRequired
};
    componentWillMount() {
        /* 发起请求 */
        this.props.actions.initState();
        this.context.router.setRouteLeaveHook(
            this.props.route,
            this.routerWillLeave
        )
    }
  routerWillLeave( nextLocation ){
        console.log("路由跳转---"+ nextLocation.pathname);
        if(nextLocation.pathname == '/product/list'){
        window.sessionStorage.setItem("isUseCacheProductList",true);
        }
  }

 

 在商品列表页获取isUseCacheProductList这个标识,如果为true,说明是商品详情页返回来的,那么久使用缓存数据,

商品列表页代码:

渲染函数里自动滑动到上次浏览位置

render() {
        const {store} = this.context;
        var isUseCache = 
        window.sessionStorage.getItem("isUseCacheProductList");
        var top =  window.sessionStorage.getItem("top");
        if(isUseCache == "true"){
            $("html,body").animate({scrollTop: top + "px"}, 0);
        }
}

 

 这里判断是否需要请求接口数据还是使用缓存数据

componentDidMount() {
        const {store} = this.context;
        var isUseCache = window.sessionStorage.getItem("isUseCacheProductList");
        if(isUseCache != "true"){
            this.props.actions.findProductList("", 1, store.getState().productTodos.pageSize, this.state.categoryId, this.state.keyword, [],isShowInStock,slectString,store.getState().commonTodos.userTypeCode);
        }
       
    }

 

 商品列表页销毁时记录滑动距离,重置 isUseCacheProductList 标识为false。

    componentWillUnmount(){
        //window.addEventListener('scroll', this.handleScroll);
        var top = $(document).scrollTop();
        window.sessionStorage.setItem("top",top);
        window.sessionStorage.setItem("isUseCacheProductList",false);
        console.log("距离顶部距离="+top)
    }

 

 

 

 

posted @ 2019-11-26 14:02  风随心动*  阅读(2841)  评论(0编辑  收藏  举报