一步一步教你寫 React 分頁組件(二)

  • 此分頁組件已發(fā)布至NPM,歡迎下載并提意見

上一篇文章實(shí)現(xiàn)了一個靜態(tài)版本的分頁組件,沒有任何交互昵骤。在本篇文章中,我們將一步一步實(shí)現(xiàn)動態(tài)頁碼和交互效果肯适。

將頁碼放在 Props 中

在實(shí)際的項(xiàng)目中变秦,總頁數(shù)都是動態(tài)變化的,需要從后端獲取框舔,因此我們將總頁數(shù)放到 Props 中蹦玫,以動態(tài)生成頁碼。
定義一個名為 config 的 Props刘绣,該 Props 是一個對象樱溉,在該對象中放入分頁相關(guān)的變量。
調(diào)用該分頁組件:

import React,{ Component } from "react";
import Pagination from "../Pagination";

export default class App extends Component{
    render(){
        return(
            <article>
                <Pagination config = {{
                    totalPage:10,
                }}></Pagination>
            </article>
        );
    }
}

通過 Props 動態(tài)生成頁碼:

import React,{ Component } from "react";
import style from "./pagination.scss";
export default class Pagination extends Component{
    constructor(props){
        super(props)
    }

    create(){
        const {
            totalPage,
        } = this.props.config;

        let pages = [];
        pages.push(<li key={0}>上一頁</li>)
        for(let i = 1;i <= totalPage; i++){
            pages.push(<li key={i}>{i}</li>)
        }
        pages.push(<li key={totalPage + 1}>下一頁</li>)

        return pages;
    }

    render(){
        const Pages = this.create.bind(this)();
        return(
            <div className = { style.main }>
                <ul className = { style.page }>
                    { Pages }
                </ul>
            </div>
        );
    }
}

上面的 create 方法用來動態(tài)生成分頁纬凤,該方法返回一個 JSX 列表福贞。
使用 Props 動態(tài)生成頁碼的效果如圖:

動態(tài)生成頁碼.png

使頁碼可點(diǎn)擊

現(xiàn)在我們來實(shí)現(xiàn)點(diǎn)擊頁碼,給當(dāng)前的 li 元素添加樣式停士。思路:

  • state 中放一個屬性挖帘,表示當(dāng)前頁面
  • 每次點(diǎn)擊頁碼時,更新該 state
  • 若頁碼數(shù)字和該 state 相等向瓷,即應(yīng)用 active 樣式

下面是實(shí)現(xiàn)代碼:

import React,{ Component } from "react";
import style from "./pagination.scss";
export default class Pagination extends Component{
    constructor(props){
        super(props)
        // 設(shè)置當(dāng)前頁碼肠套,默認(rèn)為第一頁
        this.state = {
            pageCurr:1,
        }
    }

    create(){
        const {
            totalPage,
        } = this.props.config;

        const {
            pageCurr,
        } = this.state;

        let pages = [];
        pages.push(<li key={0}>上一頁</li>)
        for(let i = 1;i <= totalPage; i++){
            // 點(diǎn)擊頁碼時調(diào)用 go 方法,根據(jù) state 判斷是否應(yīng)用 active 樣式
            pages.push(<li onClick = { this.go.bind(this,i) } className = { pageCurr === i ? style.active : "" } key={i}>{i}</li>)
        }
        pages.push(<li key={totalPage + 1}>下一頁</li>)

        return pages;
    }
    
    // 更新 state
    go(pageCurr){
        this.setState({
            pageCurr
        })
    }

    render(){
        const Pages = this.create.bind(this)();
        return(
            <div className = { style.main }>
                <ul className = { style.page }>
                    { Pages }
                </ul>
            </div>
        );
    }
}

實(shí)現(xiàn)效果如圖:

根據(jù)state響應(yīng)點(diǎn)擊.gif

go 方法是該組件的核心方法猖任,用來更新 state你稚,響應(yīng)操作。

響應(yīng)上一頁和下一頁操作

在進(jìn)行上一頁和下一頁操作時朱躺,核心原理依然不變:通過改變 state刁赖,動態(tài)應(yīng)用樣式。我們再定義兩個方法:

  • goPrev 控制頁面向前
  • goNext 控制頁面向后

進(jìn)一步完善代碼:

create(){
...
    let pages = [];
    pages.push(<li onClick = { this.goPrev.bind(this) } key={0}>上一頁</li>)
...
    pages.push(<li onClick = { this.goNext.bind(this) } key={totalPage + 1}>下一頁</li>)
    return pages;
}

...
// 頁面向前
goPrev(){
    let {
        pageCurr,
    } = this.state;

    this.go( --pageCurr )
}
// 頁面向后
goNext(){
    let {
        pageCurr,
    } = this.state;

    this.go( ++pageCurr )
}
...

這步完成后长搀,我們的分頁組件已經(jīng)初具雛形了宇弛,下面是實(shí)現(xiàn)效果:

上下頁切換.gif

至此,我們已經(jīng)由靜態(tài)組件逐步過渡到了可動態(tài)生成頁碼源请、能對用戶操作進(jìn)行響應(yīng)的動態(tài)組件枪芒。本文到這里也就結(jié)束了彻况,后面的文章中,將在此基上實(shí)現(xiàn)更多的功能舅踪。敬請期待:)

完纽甘。

一步一步教你寫 React 分頁組件(一)
一步一步教你寫 React 分頁組件(二)
一步一步教你寫 React 分頁組件(三)
一步一步教你寫 React 分頁組件(四)
一步一步教你寫 React 分頁組件(五)
一步一步教你寫 React 分頁組件(六)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抽碌,隨后出現(xiàn)的幾起案子悍赢,更是在濱河造成了極大的恐慌,老刑警劉巖货徙,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件左权,死亡現(xiàn)場離奇詭異,居然都是意外死亡痴颊,警方通過查閱死者的電腦和手機(jī)赏迟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠢棱,“玉大人瀑梗,你說我怎么就攤上這事∩殉叮” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵谤职,是天一觀的道長饰豺。 經(jīng)常有香客問我,道長允蜈,這世上最難降的妖魔是什么冤吨? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮饶套,結(jié)果婚禮上漩蟆,老公的妹妹穿的比我還像新娘。我一直安慰自己妓蛮,他們只是感情好怠李,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛤克,像睡著了一般捺癞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上构挤,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天髓介,我揣著相機(jī)與錄音,去河邊找鬼筋现。 笑死唐础,一個胖子當(dāng)著我的面吹牛箱歧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播一膨,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼呀邢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汞幢?” 一聲冷哼從身側(cè)響起驼鹅,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎森篷,沒想到半個月后输钩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仲智,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年买乃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钓辆。...
    茶點(diǎn)故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡剪验,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出前联,到底是詐尸還是另有隱情功戚,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布似嗤,位于F島的核電站啸臀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烁落。R本人自食惡果不足惜乘粒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伤塌。 院中可真熱鬧灯萍,春花似錦、人聲如沸每聪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽药薯。三九已至他爸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間果善,已是汗流浹背诊笤。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巾陕,地道東北人讨跟。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓纪他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晾匠。 傳聞我的和親對象是個殘疾皇子茶袒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評論 2 361

推薦閱讀更多精彩內(nèi)容