react实现listView组件
如何实现移动端的滑动分页加载?
如何实现这是个问题,将这个问题进行转化,如何判断页面滑动到底部,触发分页数据的请求是解决问题的关键,得益于react封装了在数据更新情况下对dom的操作,我们只需要改变页面数据,即可完成对页面的重新渲染。
分页数据的处理
//通过ajax请求获取到最新一次请求的分页数据
var _dataList = response.data.list;
var prv_dataList = this.state.dataList;
console.log('当前的页数为:' + pageNumber);
this.setState({
//每页的数据都是array数据,新的数据通过concat添加到原来的数据,通过改变state,自动完成页面的渲染
dataList: prv_dataList.concat(_dataList)
})
如何判断滑动到页面底部
首先我们获取客户端高度,即可视高度,我们所能看到的屏幕高度,这个一般是滑动列表外部滑块的所在的container的高度;
var clientHeight = document.documentElement.clientHeight;
接下来我们获取内部的数据列表的高度,这个高度为数据内容的高度;
var scrollHeight = document.documentElement.scrollHeight;
最后我们获取滚动条距离顶部的距离;
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
判断页面滑动到底部的方法为:
scrollTop + clientHeight == scrollHeight
完整组件代码
/**
* Created by jcxu on 2016/11/9.
* discription:
*/
let OrderStatus = require('../OrderStatus');
let HistoryItem = React.createClass({
displayName: 'HistoryItem',
render: function () {
return (
<div className="history-container">
<div className="status">
<span className={this.props.orderstatus=='02'?'order-status':'order-status-noBackground'}>{OrderStatus[this.props.orderstatus]}</span><span className="right">订单号:{this.props.orderid}</span>
</div>
<div className="description" onClick={this.linkTo}>
<div className="ins">
<div>收货人: {this.props.addcontact} {this.props.contactsex=='01'?'先生':'女士'}</div>
<div>手机号: {this.props.addmobile}</div>
<div>订单时间: {formatDataNow(this.props.createdate)}</div>
<div style={{height: 40}}>收货地址: {this.props.addprov+' '+
this.props.addcity+' '+
this.props.addcounty+' '+
this.props.addroad+' '+
this.props.adddetail}</div>
</div>
<div className="more">
<a href={'#/historyDetail/'+this.props.orderid}>
<img style={{width: 10,margin: '9px 0 0 3px'}} src="img/right-arrow.png" alt=""/>
</a>
</div>
</div>
</div>
)
},
linkTo: function () {
location.href='#/historyDetail/'+this.props.orderid
}
});
let HistoryMore = {
displayName: 'HistoryMore',
getInitialState: function () {
return ({
dataList: [],
pageNumber: 1,
isFirst: true//判断是不是第一次到达底部
})
},
render: function () {
return (
<div ref="itemList">
<div style={{ width: '100%', height: 'auto',paddingTop: '54px' }} >
{
this.state.dataList.length!=0 ? this.state.dataList.map((item, i) => {
return (
<HistoryItem {...item} key={i}/>
)
}) : ''
}
{
this.state.isFirst ? '' : <div style={{ width: '100%', height: '50px',marginTop: '20px', lineHeight: '50px', textAlign: 'center', border: '1px solid #018ee0' }}>没有更多数据了!</div>
}
</div>
</div>
);
},
componentDidMount: function () {
window.addEventListener('scroll', this.handleScroll);
this.getData(1)
},
componentWillUnmount: function () {
window.removeEventListener('scroll', this.handleScroll);
},
handleScroll: function (e) {
//console.log('浏览器滚动事件');
//console.dir(e);
//距离顶部的距离
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
//console.log('scrollTop: ' + scrollTop);
//可滑动的高度
var scrollHeight = document.documentElement.scrollHeight;
//console.log('scrollHeight: ' + scrollHeight);
//客户端gaodu
var clientHeight = document.documentElement.clientHeight;
//console.log('clientHeight: ' + clientHeight);
if (scrollTop + clientHeight == scrollHeight) {
console.log('++++++++++++++++++++++++')
if (this.state.isFirst) {
var pre_pageNumber = this.state.pageNumber;
this.setState({
pageNumber: pre_pageNumber + 1
})
this.getData(pre_pageNumber + 1)
}
else {
alert('没有更多数据了!');
}
}
},
getData: function (pageNumber) {
//console.log('获取数据开始执行了!');
//'../../../demo/nestle/history' + pageNumber + '.json'
//'shop/SearchOrdBase/'+custInformation.custid+'/'+pageNumber
$.get('shop/SearchOrdBaseLimit/'+custInformation.custid+'/'+pageNumber, function (date) {
var response = $.parseJSON(date);
if (response.success) {
var list = response.data.list;
if (list.length != 0) {
//console.log(response.message);
var _dataList = response.data.list;
var prv_dataList = this.state.dataList;
console.log('当前的页数为:'+pageNumber);
this.setState({
dataList: prv_dataList.concat(_dataList)
})
}
else {
this.setState({
isFirst: false
})
}
}
else {
this.setState({
isFirst: false
})
}
}.bind(this))
}
};
module.exports = React.createClass(HistoryMore);
最后更新于