簡單的分頁組件(react)

簡單的分頁組件
...因爲工做緣由, 寫過一段vue, 如今入手jquery.本身是戰五渣選手,爲了鞏固以前學過的react,特地用react來實現,其實想用jquery。 github L6zt
代碼效果如圖:
圖片描述vue


思路:
組件基本屬性:
cur 當前頁碼,
all 總頁碼
space 頁面顯示數量 +1 纔是 總數量
組件總體狀態react

一、與首頁相連, cur < space 基本知足圖片描述
二、中間狀態,cur > space && cur < all - space圖片描述
三、與末尾相連,cur > all - space圖片描述
react 基本操做
子組件Pagination 經過 props 更新狀態, 和state無關。
show codejquery

// 判斷 是否是數字
const isNumber = (num) => {
    return typeof num === 'number';
}
class Pagination extends  React.Component {
    constructor (props) {
        super(props);
    }
    // 點擊回調事件    
    handleClick (item) {
      // 父組件回調事件
      this.props.cb(item);
    }
    render () {
        let {cur, space, all} = this.props;
        let pgObj = [];
        // 給不一樣的元素 賦值class
        const checkClass = (role, active) => {
            const defaultClass = 'pg-span';
            if (active) {
                return    `${defaultClass} active`
            }
            switch (role) {
                case 0: {
                    return `${defaultClass}`
                }
                case 1: {
                    return `${defaultClass}`
                }
                default: {
                
                }
            }
        }
        // 初始檢查
        if (all < space) {
            all =  space
        }
        if (cur <= 0) {
            cur = 0
        }
        if (cur >= all) {
        cur = all
        } 
        // 階段判斷
        if (cur < space) {
            if (space === all) {
                for (let i = 1; i <= space; i++) {
                    pgObj.push({
                        page: i,
                        role: 0,
                        key: i
                    })
                }
            } else {
                for (let i = 1; i <= space; i ++) {
                    pgObj.push({
                        page: i,
                        role: 0,
                        key: i
                    })
                }
                pgObj.push({
                    page: '...',
                    role: 1,
                    key: 'next'
                })
                pgObj.push({
                    page: all,
                    role: 0,
                    key: all
                })
            }
        } else if (cur >= space && cur <= all - space + 1) {
            let odd = parseInt(space / 2);
            pgObj.push({
                page: 1,
                role: 0,
                key: 1
            });
            pgObj.push({
                page: '...',
                role: 1,
                key: 'pre'
            });
            for (let i = cur - odd; i <= cur + odd ; i ++) {
                pgObj.push({
                    page: i,
                    role: 1,
                    key: i
                })
            }
            pgObj.push({
                page: '...',
                role: 1,
                key: 'next'
            });
            pgObj.push({
                page: all,
                role: 1,
                key: all
            })
        } else {
            pgObj.push({
                page: 1,
                role: 0,
                key: 1
            });
            pgObj.push({
                page: '...',
                role: 1,
                key: 'pre'
            });
            for (let i = all - space + 1; i <= all; i ++) {
                pgObj.push({
                    page: i,
                    role: 0,
                    key: i
                })
            };
        }
        return (
            <section>
                {
                    pgObj.map(item =>
                        (<span key={item.key}
                               className={checkClass(item.role, item.page === cur)}
                               onClick={() => {this.handleClick(item)}}
                        >
                        {item.page}
                        </span>))
                }
            </section>
        )
    }
    
}
class Root extends React.Component {
  constructor (props) {
      super(props);
      this.state = {
        cur: 1
      };
      this.handlePagination = this.handlePagination.bind(this);
  }
  handlePagination (item) {
      const {page} = item;
      if (isNumber(page)) {
          this.setState({
              cur: page
          })
      }
  }
  render() {
    let {cur} = this.state;
    console.log(cur);
    return  (
      <div>
         <Pagination cur={cur} all={100} space={8} cb={this.handlePagination} />
      </div>
    )
  }
};
ReactDOM.render(
  <Root></Root>,
  document.getElementById('root')
);

demo地址git

相關文章
相關標籤/搜索