美文网首页
React实现翻页功能

React实现翻页功能

作者: feeling_1f11 | 来源:发表于2017-10-27 15:33 被阅读388次

    由于项目中遇到简单的类似于轮播图中,左右翻页功能,首先明白需求是这样的:

    一个页面最多展示6条从后台返回的数据,如果少于6条,一页全部展示,多于6条,做分页处理。

    整体思路:

    1.首先,声明一个空的数组arr,用于保存截取的数据;

    2.其次,声明一个常量NUM,用于保存一页展示的数据条数,便于日后改需求;

    3.然后在constructor里声明一个标志位flag,便于把每一次翻页的信息记录下来。(注意:这里的flag相当于一个全局变量,可以在constructor里通过this.flag = 0来声明,也可以在class外声明一个全局变量)

    4.最后就是实现分页功能的原理:

          ①如果是向左翻页,首先判断flag标志位是否为0,如果过标志位为0,则表示已经是第一页,不能继续向左翻页,把flag置为  
               0,否则,每点击  一次,让flag-1;
    
           ②如果是向右翻页,则需要做两步判断:
    
                  a.首先判断是否是NUM的整数倍,如果是NUM 的整数倍(arr.length % NUM == 0),表示每页都有NUM条数据,此时
                     继续判断是否已经翻到最后一页(this.flag >= arr.length/NUM-1),如果已经翻页到最后一页,把flag设置为
                     arr.length/NUM-1,不能继续向右翻页,否 则,每点击一次让flag+1;
    
                  b.其次判断不是NUM的整数倍,最后一页不能展示NUM条数据,此时判断是否已经翻页到最后一页,如果已经翻页到最
                      后一页,把flag标志位设置为Math.floor(arr.length/NUM),否则,让flag+1
    
    class Lists extends React.Component {
        constructor(porps){
            super(porps);
            this.state = {
                datas:[]
            };
            //设置翻页标志位全局变量
            this.flag = 0;
            this.getPageData = this.getPageData.bind(this);
        }
    
        componentDidMount(){
            this.getPageData();
        }
    
        //页面加载时,获取前几条数据
        getPageData(){
            var lists = this.props.tools.slice(0,6);
            this.setState({
                datas:lists
            })
            console.log("lists------>",lists);
        }
    
        //左右翻页功能
        changePage(num){
            var newArr = [];
            const NUM = 6;
            /*var flag = 0;*/
            var arr = this.props.tools;
            //如果是向左滑动,首先判断标志位flag是否小于等于0
            if(num == -1){
                //如果标志位为0,则表示不能向左滑动,把flag标志位置位0
                if(this.flag <= 0){
                    this.flag = 0;
                    newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                }else{
                    this.flag = this.flag - 1;
                    newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                }
            }else{//如果向右滑动,则需要判断上限
                //首先判断是不是NUM的整数倍
                //如果是NUM的整数倍
                /*debugger;*/
                if(arr.length % NUM == 0){
                    //如果flag大于等于arr.length/NUM-1,把flag置为arr.length/NUM-1
                    if(this.flag >= arr.length/NUM-1){
                        flag = arr.length/NUM-1;
                        newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                    }else{//如果flag小于arr.length/NUM-1
                        this.flag = this.flag + 1;
                        newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                    }
                }else{//如果不是NUM的整数倍
                    //如果flag大于等于Math.floor(arr.length/NUM),把flag置为Math.floor(arr.length/NUM)
                    if(this.flag >= Math.floor(arr.length/NUM)){
                        this.flag = Math.floor(arr.length/NUM);
                        newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                    }else{//如果flag小于Math.floor(arr.length/NUM)
                        this.flag = this.flag + 1;
                        newArr = arr.slice(this.flag*NUM,this.flag*NUM+NUM);
                    }
                }
            }
            console.log(newArr);
            this.setState({
                datas:newArr
            })
        }
    
        render() {
            return (
                <div className={ style.container }>
                    <div className={ style.left } onClick={()=> this.changePage(-1)}>
                        ![](/static/img/tools/arrow_left.png)
                    </div>
                    <div className={ style.middle }>
                        {
                            this.state.datas.map( (value,index) => {
                                return(
                                    <div className={ style.content } key={ index }>
                                        <Analyze value = { value }></Analyze>
                                    </div>
                                )
                            })
                        }
                    </div>
                    <div className={ style.right } onClick={()=> this.changePage(1)}>
                        ![](/static/img/tools/arrow_right.png)
                    </div>
                </div>
            )
        }
    }
    
    export default Lists;
    

    还有一点需要注意的是:由于我 把从后台获取到的数据保存到了state里面,当页面首次加载的时候,this.state = { datas:[ ] },datas为空数组;不会显示数据,后来得到了改进,在componentDidMount的时候,加载几条数据,用于第一页显示。

    componentDidMount(){
            this.getPageData();
        }
    
        //页面加载时,获取前几条数据
        getPageData(){
            var lists = this.props.tools.slice(0,6);
            this.setState({
                datas:lists
            })
            console.log("lists------>",lists);
        }
    

    相关文章

      网友评论

          本文标题:React实现翻页功能

          本文链接:https://www.haomeiwen.com/subject/zttdpxtx.html