react分页

首先建立一个单独的jsx文件里面

import React, { Component } from "react";
class Com extends React.Component {
  constructor(props) {
    super(props);
    let { pageConfig } = props;
    this.state = {
      currentPage: Number(pageConfig.currentPage), //当前页码
      groupCount: 5, //页码分组,显示7个页码,其余用省略号显示
      startPage:
        Number(pageConfig.currentPage) - 2 > 0
          ? Number(pageConfig.currentPage) - 2
          : Number(pageConfig.currentPage), //分组开始页码
      totalPage: pageConfig.totalPage, //总页数
    };
  }
  createPage() {
    const { currentPage, groupCount, startPage, totalPage } = this.state;
    let pages = [];
    //上一页
    pages.push(
      <li
        className={currentPage === 1 ? "nomore" : null}
        onClick={this.prePageHandeler.bind(this)}
        key={0}
      >
        上一页
      </li>
    );

    if (totalPage <= 10) {
      /*总页码小于等于10时,全部显示出来*/
      for (let i = 1; i <= totalPage; i++) {
        pages.push(
          <li
            key={i}
            onClick={this.pageClick.bind(this, i)}
            className={currentPage === i ? "activePage" : null}
          >
            {i}
          </li>
        );
      }
    } else {
      /*总页码大于10时,部分显示*/
      //第一页
      pages.push(
        <li
          className={currentPage === 1 ? "activePage" : null}
          key={1}
          onClick={this.pageClick.bind(this, 1)}
        >
          1
        </li>
      );
      let pageLength = 0;
      if (groupCount + startPage > totalPage) {
        pageLength = totalPage;
      } else {
        pageLength = groupCount + startPage;
      }
      //前面省略号(当当前页码比分组的页码大时显示省略号)
      if (currentPage >= groupCount) {
        pages.push(
          <li className="omission" key={-1}>
            ···
          </li>
        );
      }
      //非第一页和最后一页显示
      for (let i = startPage; i < pageLength; i++) {
        if (i <= totalPage - 1 && i > 1) {
          pages.push(
            <li
              className={currentPage === i ? "activePage" : null}
              key={i}
              onClick={this.pageClick.bind(this, i)}
            >
              {i}
            </li>
          );
        }
      }
      //后面省略号
      if (totalPage - startPage >= groupCount + 1) {
        pages.push(
          <li className="omission" key={-2}>
            ···
          </li>
        );
      }
      //最后一页
      pages.push(
        <li
          className={currentPage === totalPage ? "activePage" : null}
          key={totalPage}
          onClick={this.pageClick.bind(this, totalPage)}
        >
          {totalPage}
        </li>
      );
    }
    //下一页
    pages.push(
      <li
        className={currentPage === totalPage ? "nomore" : null}
        onClick={this.nextPageHandeler.bind(this)}
        key={totalPage + 1}
      >
        下一页
      </li>
    );
    return pages;
  }
  //页码点击
  pageClick(currentPage) {
    const { groupCount } = this.state;
    const { getCurrentPage } = this.props;
    //当 当前页码 大于 分组的页码 时,使 当前页 前面 显示 两个页码
    if (currentPage >= groupCount) {
      this.setState({
        startPage: currentPage - 2,
      });
    }
    if (currentPage < groupCount) {
      this.setState({
        startPage: 1,
      });
    }
    //第一页时重新设置分组的起始页
    if (currentPage === 1) {
      this.setState({
        startPage: 1,
      });
    }
    this.setState({
      currentPage,
    });
    // 缓存当前页码
    sessionStorage.setItem("currentPage", encodeURIComponent(currentPage));
    //将当前页码返回父组件
    getCurrentPage(currentPage);
  }
  //上一页事件
  prePageHandeler() {
    let { currentPage } = this.state;
    if (--currentPage === 0) {
      return false;
    }
    this.pageClick(currentPage);
  }

  //下一页事件
  nextPageHandeler() {
    let { currentPage, totalPage } = this.state;
    // const {totalPage} = this.props.pageConfig;
    if (++currentPage > totalPage) {
      return false;
    }
    this.pageClick(currentPage);
  }
  render() {
    return (
      <div className="page_container">
        <ul>{this.createPage()}</ul>
      </div>
    );
  }
}
export default Com;

其次在主页面

import React, { Component } from "react";

// import axios from "axios";

import { withRouter } from "react-router-dom";
import { observer, inject } from "mobx-react";
//这里引入的是上面那个jsx 名字位置可以随便放
import PageNav from "../../component/PageNav";

@withRouter
@inject("iu", "newobs")
@observer
class box extends Component {
  constructor(props) {
    super(props);
    this.state = {
      newIu: [],
      Boor: true,
      pageCfg: {
        page_number: "1",
        page_size: "10",
      },
      pageConfig: {
        currentPage: "1",
        totalPage: "31",
      },
    };
    this.ajaxPage = this.ajaxPage.bind(this);
  }
  newobs = this.props.newobs;

  ajaxPage(i) {
    const { getApi } = this.newobs;
    const { pageCfg } = this.state;
    pageCfg.page_number = i.toString();
    // let obj = {
    //   page_number: "1",
    //   page_size: "10",
    // };
    getApi("/home/mediareports", pageCfg, {}).then((res) => {
      // console.log(res.data);
      this.setState({
        newIu: res.data.data,
        Boor: false,
        pageConfig: {
          currentPage: i,
          totalPage: Math.ceil(res.data.total / pageCfg.page_size),
        },
      });
    });
  }
  componentDidMount() {
    this.ajaxPage(this.state.pageConfig.currentPage);
  }
  _boor() {
    if (this.state.Boor) {
      return (
        <div className="loading_box">
          <div className="loading"></div>
        </div>
      );
    } else {
      const list = this.state.newIu.map((val) => (
        <li key={val.id}>
          <a href={val.jump_url}>{val.main_title}</a>
          <span>{val.source}</span>
          <span>{val.sourceData}</span>
        </li>
      ));
      return this.state.newIu.length !== 0 ? (
        <ul>{list}</ul>
      ) : (
        <div className="no_result">知恩,危险</div>
      );
    }
  }
  render() {
    // pageConfig
    const pageCfg = {
      pageConfig: this.state.pageConfig,
      getCurrentPage: this.ajaxPage,
    };
    return (
      <React.Fragment>
        <p>与你有的不是遗憾而是梦醒</p>
        {this._boor()}
        {this.state.newIu.length !== 0 ? <PageNav {...pageCfg} /> : ""}
      </React.Fragment>
    );
  }
}

export default box;

因为请求的是ajax所以要在src文件夹中建立一个setupProxy.js文件

  • 名字是固定的不可以随便取名
const { createProxyMiddleware } = require('http-proxy-middleware');
module.exports = function(app) {
    app.use(
      '/home',createProxyMiddleware({
        target: 'https://home-api.pinduoduo.com/',
        changeOrigin: true,
      })
    );
};

这里面用到了mobx

  • 动态的追加数据在mobx里面请求ajax
import {observable, computed, action, autorun,runInAction, makeObservable} from 'mobx';
import axios from 'axios';

export default  class Iu {
   @action
  async getApi(url, cfg, headers) {
    let data = await axios.get(
      url,
      { params: cfg },
      {
        headers: headers,
      }
    );
    return data;
  }
}

css样式

@charset "UTF-8";
/**
使用方法
@include keyframes(anMeinv,(
    0%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(165) pxToRem(157)
    ),
    50%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(265) pxToRem(257)
    ),
    75%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(565) pxToRem(657)
    ),
    100%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(465) pxToRem(557)
    )
));
@include animation(anMeinv 2s ease-out forwards);

*/
/**
使用方法
@include keyframes(anMeinv,(
    0%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(165) pxToRem(157)
    ),
    50%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(265) pxToRem(257)
    ),
    75%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(565) pxToRem(657)
    ),
    100%:(
        background: url(i/meinv.png) no-repeat pxToRem(140) pxToRem(11),
        background-size: pxToRem(465) pxToRem(557)
    )
));
@include animation(anMeinv 2s ease-out forwards);

*/
.page_container {
  padding: 30px 0; }
  .page_container ul {
    text-align: center;
    font-size: 0; }
    .page_container ul li {
      display: inline-block;
      margin: 0 10px;
      border: 1px solid #ccc;
      height: 30px;
      line-height: 30px;
      box-sizing: border-box;
      font-size: 14px;
      padding: 0 10px;
      cursor: pointer; }
      .page_container ul li.activePage {
        color: red;
        border: 1px solid red;
        text-align: center; }
      .page_container ul li:first-child, .page_container ul li:last-child {
        width: auto; }
      .page_container ul li.nomore {
        cursor: default;
        color: #999; }
      .page_container ul li.omission {
        border: none;
        margin: 0;
        font-family: Arial; }

.loading_box {
  height: auto; }
  .loading_box .loading {
    width: 100px;
    height: 100px;
    margin: 50px auto;
    position: relative; }
    .loading_box .loading:before {
      content: "";
      position: absolute;
      display: block;
      border: 5px solid #1c71ff;
      opacity: .9;
      width: 50px;
      height: 50px;
      left: 50%;
      top: 50%;
      margin: -25px 0 0 -25px;
      border-top-color: transparent;
      border-bottom-color: transparent;
      border-radius: 50%;
      -webkit-box-shadow: 0 0 35px #1c71ff;
      -moz-box-shadow: 0 0 35px #1c71ff;
      box-shadow: 0 0 35px #1c71ff;
      -webkit-animation: spin-right 0.5s 0s linear infinite normal;
      -moz-animation: spin-right 0.5s 0s linear infinite normal;
      -ms-animation: spin-right 0.5s 0s linear infinite normal;
      -o-animation: spin-right 0.5s 0s linear infinite normal;
      animation: spin-right 0.5s 0s linear infinite normal; }

@-webkit-keyframes spin-right {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    opacity: 1; }
  100% {
    transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    opacity: 0.2; } }

@-moz-keyframes spin-right {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    opacity: 1; }
  100% {
    transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    opacity: 0.2; } }

@-ms-keyframes spin-right {
  .loading_box .loading:before 0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  .loading_box .loading:before 50% {
    transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    opacity: 1; }
  .loading_box .loading:before 100% {
    transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    opacity: 0.2; } }

@-o-keyframes spin-right {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    opacity: 1; }
  100% {
    transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    opacity: 0.2; } }

@keyframes spin-right {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(180deg);
    -ms-transform: rotate(180deg);
    -moz-transform: rotate(180deg);
    -webkit-transform: rotate(180deg);
    -o-transform: rotate(180deg);
    opacity: 1; }
  100% {
    transform: rotate(360deg);
    -ms-transform: rotate(360deg);
    -moz-transform: rotate(360deg);
    -webkit-transform: rotate(360deg);
    -o-transform: rotate(360deg);
    opacity: 0.2; } }
    .loading_box .loading:after {
      content: "";
      position: absolute;
      display: block;
      width: 30px;
      height: 30px;
      border: 5px solid #1c71ff;
      opacity: .9;
      border-radius: 50%;
      border-left-color: transparent;
      border-bottom-color: transparent;
      -webkit-box-shadow: 0 0 35px #1c71ff;
      -moz-box-shadow: 0 0 35px #1c71ff;
      box-shadow: 0 0 35px #1c71ff;
      left: 50%;
      top: 50%;
      margin: -15px 0 0 -15px;
      -webkit-animation: spin-left 0.5s 0s linear infinite normal;
      -moz-animation: spin-left 0.5s 0s linear infinite normal;
      -ms-animation: spin-left 0.5s 0s linear infinite normal;
      -o-animation: spin-left 0.5s 0s linear infinite normal;
      animation: spin-left 0.5s 0s linear infinite normal; }

@-webkit-keyframes spin-left {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -webkit-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    opacity: 1; }
  100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -moz-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
    -o-transform: rotate(-360deg);
    opacity: 0.2; } }

@-moz-keyframes spin-left {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -webkit-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    opacity: 1; }
  100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -moz-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
    -o-transform: rotate(-360deg);
    opacity: 0.2; } }

@-ms-keyframes spin-left {
  .loading_box .loading:after 0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  .loading_box .loading:after 50% {
    transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -webkit-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    opacity: 1; }
  .loading_box .loading:after 100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -moz-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
    -o-transform: rotate(-360deg);
    opacity: 0.2; } }

@-o-keyframes spin-left {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -webkit-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    opacity: 1; }
  100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -moz-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
    -o-transform: rotate(-360deg);
    opacity: 0.2; } }

@keyframes spin-left {
  0% {
    transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    -moz-transform: rotate(0deg);
    -webkit-transform: rotate(0deg);
    -o-transform: rotate(0deg);
    opacity: 0.2; }
  50% {
    transform: rotate(-180deg);
    -ms-transform: rotate(-180deg);
    -moz-transform: rotate(-180deg);
    -webkit-transform: rotate(-180deg);
    -o-transform: rotate(-180deg);
    opacity: 1; }
  100% {
    transform: rotate(-360deg);
    -ms-transform: rotate(-360deg);
    -moz-transform: rotate(-360deg);
    -webkit-transform: rotate(-360deg);
    -o-transform: rotate(-360deg);
    opacity: 0.2; } }

.no_result {
  text-align: center;
  padding: 30px 0;
  margin: 0 auto;
  line-height: 40px;
  font-size: 16px;
  font-family: "微软雅黑"; }

.loadingBox {
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: 999; }
  .loadingBox .loadingbg {
    background: #fff;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    z-index: 5; }
  .loadingBox .loading {
    position: absolute;
    left: 50%;
    top: 40%;
    z-index: 6;
    margin: 0 0 0 -20px;
    position: relative;
    overflow: hidden; }

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容