react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置
现状:目前从商品详情页返回到商品列表页,还需要再去请求服务数据,还需要用户再去等待获取数据的过程,这样用户体验非常不好,
遇到的问题:
1:如何将数据缓存,
2:如何获取和保存列表滑动的高度,
3:判断商品列表页的上一个页面是什么?
如果是从搜索页进到商品列表页的话我们需要清除缓存,获取接口数据,
如果是商品详情页返回到商品列表页的话就用缓存数据,并且滑到到上次浏览的位置。
一:数据缓存
使用react全家桶reducers保存数据
dispatch({
type: types.PRODUCT_LIST,
productlist: oldList.concat(data.result),
totalPage: data.totalPage,
curPage: page,
totalCount: data.totalCount
});
二:获取和保存列表滑动的高度
在商品列表页销毁方法里记录滑动高度
componentWillUnmount(){
var top = $(document).scrollTop();
window.sessionStorage.setItem("top",top);
window.sessionStorage.setItem("isUseCacheProductList",false);
}
三:判断商品列表页的上一个页面是什么
在商品详情页离开时劫持路由,判断如果是去商品列表页的话,就设置标识为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)
}
react 从商品详情页返回到商品列表页,列表自动滚动上次浏览的位置的更多相关文章
- 自己定义ViewGroup实现仿淘宝的商品详情页
近期公司在新版本号上有一个须要. 要在首页加入一个滑动效果, 详细就是仿照X宝的商品详情页, 拉到页面底部时有一个粘滞效果, 例如以下图 X东的商品详情页,假设用户继续向上拉的话就进入商品图文描写叙述 ...
- 在ecshop商品详情页显示供货商
好久没写文章了,隐约记得前几天有人问到这个问题:[如何在ecshop商品详情页面显示该商品的供货商?] 今天有时间整理下,分享给大家. 注:以下修改适用于ecshop2.7.2,其他版本未做测试. 1 ...
- 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...
- 微信小程序电商实战-商品详情(上)
先看一下今天要实现的小程序商品详情页吧! 商品详情.gif 本期我们要实现小程序商品详情页的头部标题.头部轮播.商品详情浮动按钮和商品内页布局. 一.设置头部标题 如上图所示,头部标题是商品详情 ...
- python3 - 商品管理的程序,商品信息都存在一个json串里面
商品管理的程序,商品信息都存在一个json串里面 1.查询商品信息 #校验商品是否存在 2.新增商品 # #校验商品是否存在 #校验价格是否合法 3.修改商品信息 ##校验商品是否存在 if chic ...
- 商品详情页系统的Servlet3异步化实践
http://jinnianshilongnian.iteye.com/blog/2245925 博客分类: 架构 在京东工作的这一年多时间里,我在整个商品详情页系统(后端数据源)及商品详情页统一 ...
- Android跳转淘宝、京东APP商品详情页
import Android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; imp ...
- 高并发 Nginx+Lua OpenResty系列(10)——商品详情页
本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...
- Ecshop商品详情页显示当前会员等级价格
会员登录状态下,在ECSHOP商品详情页的本店售价中显示当前登录会员对应的等级价格,在未登录状态下,则还默认显示原来的本店售价. 解决方法: 这个需要修改ECSHOP程序代码来实现. 打开文件 /in ...
随机推荐
- 人脸三维建模A Morphable Model For The Synthesis Of 3D Faces(三维人脸合成的变形模型)
Abstract摘要 In this paper, a new technique for modeling textured 3D faces is introduced. 3D faces can ...
- [CSP-S模拟测试]:最小距离(最短路)
题目传送门(内部题97) 输入格式 第一行三个整数$n,m,p$,第二行$p$个整数$x_1\sim x_p$表示特殊点的编号.接下来$m$行每行三个整数$u,v,w$表示一条连接$u$和$v$,长度 ...
- Hive、Spark优化案例
一.Join原则 将条目少的表/子查询放在Join的左边.原因:在Join的reduce阶段,位于Join左边的表的内容会被加载进内存,条目少的表放在左边,可以减少发生内存溢出的几率. 小表关联大表: ...
- POST上传多张图片配合Django接受多张图片
POST上传多张图片配合Django接受多张图片 本地:POST发送文件,使用的是files参数,将本地的图片以二进制的方式发送给服务器. 在这里 files=[("img",op ...
- @清晰掉 spi协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...
- 阶段3 1.Mybatis_09.Mybatis的多表操作_3 完成account的一对一操作-通过写account的子类方式查询
先把多表查询的sql语句写出来 想要显示的字段 创建一个AccountUser类 继承Account.这样它就会从父类上继承一些信息 这里只需要定义username和address就可以了 .然后生成 ...
- c# 排列组合代码类
/// <summary> /// 排列组件算法类 /// </summary> /// <typeparam name="T"></ty ...
- python启动线程查看线程的名称和id;python杀掉进程的方法
def cpu_app(): print("CPU") #启动一个线程t=threading.Thread(target=cpu_app,args=()) t.daemon = T ...
- 你知道e.g.和i.e.的区别吗?
见 i.e. 是对前面的完全举例,特指 e.g. 则是不完全举例,有可能是...也有可能是...还可能是其他. 注意,i.e. 和 e.g. 第二个点后面都常跟一个逗号.
- finereport点击图表钻取到明细表包括参数传递
1. 点击编辑图表 2. 参数传递 3. 选择分类名称 4. 钻取明细表获取 inputs 值得方法 使用公司 $inputs 获取钻取传来的值