说明

打开京东手机web版,细心的你会发现,当你从首页list页跳到详情页在返回(不论你点的是app的返回还是安卓返回健)的时候列表页位置还是静静的在哪里,

在我们的react项目里如何实现呢?首先我们的了解清楚react里两个重要的上下文传递对象,props和state,props我们可以理解为全局的,这个很重要,也是我们实现

不刷新的基础,state可以理解为局部的,只对当前组件有效;

另外补充下react生命周期以及涉及的API

实例化

** 首次实例化

getDefaultProps

getInitialState

componentWillMount

render

componentDidMount

实例化完成后的更新

getInitialState

componentWillMount

render

componentDidMount

存在期

** 组件已存在时的状态改变

componentWillReceiveProps

shouldComponentUpdate

componentWillUpdate

render

componentDidUpdate

销毁&清理期

componentWillUnmount

可以看出来render是在componentDidUpdate之后,即页面渲染完才会执行,这里也是我下手的地方之一。

实现

老规矩,啥也不说了上代码

取数据1

2

3componentDidMount() {

this.props.list.data && this.props.list.data.length <= 0 && this.props.getList.call(this);

}

this.props.list.data && this.props.list.data.length <= 0 这句的目的就是防止第二次重新加载已有数据,换句话说就是只有第一次访问进来的时候

才会执行getlist方法;

数据请求了,该怎么接收呢?

接收数据1

2

3

4

5

6

7

8

9

10

11

12

13componentWillReceiveProps(newProps) {

if (newProps.list.data && newProps.list.data.length > 0) {

//第一次加载将数据换存在全局变量Glist中;

if (this.props.list.data && this.props.list.data.length <= 0) {

let newData = newProps.list.data;

Glist = newData;

}

// 之后数据使用本地缓存即可

else {

Glist = Glist;

}

}

}

Glist是个全局变量,类似本地缓存,有人问了为什么不用localStorage,因为会有浏览器兼容性问题

定位

正常情况下应该是可以实现,detail—》list不刷线的功能,但还有问题就是定位,比如list开始是在20条的位置,回来的时候应该还是在20条的位置,

没做任何处理前,pc和android是可以自动定位的,但是烂苹果就不行,还是在top0的位置,所以呢我们还得再设置个全局变量 scrollTop,默认为0,

当点击列表的时候,设置scrollTop,回来的时候再设定就可以了,完美的定位了pc、ios和android

1

2

3

4

5

6

7

8

9

10

11

12

13

14let scrollTop=0;

componentDidUpdate() {

/// 判断的目的是为了不让页面其他组件渲染完毕的时候执行定位,如果不设置判断,比如你的页面有好多子组件,每个子组件componentDidUpdate

/// 都会执行它,那么问题来了,没有判读所以都会执行以下document.body.scrollTop = scrollTop[默认为0];会看到会有往页面顶部窜动的效果

if (scrollTop > 100) {

document.body.scrollTop = scrollTop;

}

}

showDetail() {

scrollTop = document.body.scrollTop;

}

最后

如有疑问或者更好的方案留言下方……^_^

^-^欢迎回复交流^-^

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐