React实现翻页功能

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

一个页面最多展示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);
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,065评论 25 707
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,188评论 1 23
  • 人物解答/交流/建议 & Bug提交[1] by LongFei 当前公开版本: 2.1.0 with pdf 人...
    LongFei_aot阅读 17,614评论 1 14
  • 这世界,何以生出了对错,却又让一人总站于对,另一人总站于错。如此,直接生出对人与错人,岂不更加正确。这世界,是世界...
    你说她说听他说阅读 123评论 0 0
  • 小张不会讲话啦,颠三倒四。 慌乱地不可思议,心理建设全线崩塌,什么实用主义、浪漫柔情,统统追赶不上小张开合的嘴唇。...
    西野君阅读 243评论 1 0