vue+iview 封装分页组件

vue+iview的分页组件封装

1.在components中创建pagination文件夹,接着创建src,index.js,index.less文件
2.index.less文件

  //需要修改的样式
  .ivu-page-options {
    margin-left: 10px;

    .ivu-page-options-sizer {
      margin-right: 0;
    }
  }

3.index.js文件

import "./index.less";
import component from "./src/main";

/* istanbul ignore next */
component.install = function (Vue) {
  Vue.component(component.name, component);
};

export default component;

4.src文件夹中的main.vue

<template>
  <!-- 分页组件 -->
  <Page
    class="saas-pagination"
    ref="page"
    :loading="loading"
    :disabled="disabled"
    :total="total"
    :show-sizer="sizer"
    :show-elevator="elevator"
    :current="params.page"
    :page-size="params.rows"
    :page-size-opts="sizeOpts"
    @on-change="currentChange"
    @on-page-size-change="pageChange"/>
</template>

<script>
export default {
  props: {
    loading: {
      type: Boolean,
      default: false
    },
    total: {
      // 数据总数
      type: [String, Number],
      default: 0
    },
    page: {
      // 当前分页
      type: [String, Number],
      default: 1
    },
    rows: {
      // 每页显示多少条
      type: [String, Number],
      default: 10
    },
    disabled: {
      type: Boolean,
      default: false
    },
    sizer: {
      // 是否显示下拉组件
      type: Boolean,
      default: false
    },
    elevator: {
      // 是否显示跳转输入框
      type: Boolean,
      default: false
    }
  },
  watch: {
    page (to) {
      this.params.page = to;
    },

    rows (to) {
      this.params.rows = to;
    }
  },
  data () {
    return {
      sizeOpts: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
      params: {
        page: 1,
        rows: 10
      }
    }
  },
  methods: {
    // 分页改变
    currentChange (current) {
      this.params.page = current;
      this.onChange();
    },
    // 每页显示条数改变
    pageChange (rows) {
      this.params.page = 1;
      this.params.rows = rows;
      this.onChange();
    },

    onChange () {
      this.$emit("on-change", JSON.parse(JSON.stringify(this.params)));
    },

    reset () {
      this.params = {
        page: 1,
        rows: 10
      }
      this.onChange();
      // 当前页码还原
      // this.$refs.page.currentPage = 1;
    }
  }
}
</script>

5.在components中创建index.js,用于全局引入

import GlobalPage from "@/components/pagination/index.js";
export default (Vue) => {
    Vue.component("GlobalPage ", GlobalPage );
}

6然后在全局的main.js引入,可全局使用

import components from "@/components/index.js";
Vue.use(components)

7.组件的使用

<template>
  <div>
      <global-page 
        ref="pagination"
        :sizer="true"
        :page="formData.page"
        :rows="formData.rows"
        :total="total"
        @on-change="pageChange">
      </global-page>
  </div>
</template>
<script>
export default {
  data(){
   return {
       total: 0, // 数据总数
       queryForm:{},
       formData: {
          page: 1,
          rows: 10,
        }
     }
  },
   methods: {
      // 分页切换
    pageChange (params) {
      this.queryForm.page = params.page
      this.queryForm.rows = params.rows
      //查询数据的方法
      this.search(this.queryForm)
    },
  }
}

</script>

      

UView是一个基于Vue的UI组件库,它提供了一个轻量级、高性能的设计方案。在UView中,实现滚动分页通常通过`u-pagination`组件来完成。这个组件可以配合列表(如`u-list`)一起使用,当用户滚动到页面底部或顶部时,自动加载更多数据。 以下是基本步骤: 1. **引入组件**: 首先需要安装并导入`u-pagination`组件,以及可能用于显示内容的列表组件(如`u-list-item`)。 ```vue <template> <div> <u-pagination :total="totalCount" @change="loadMoreData"></u-pagination> <u-list v-loading="isLoading"> <template slot="item" slot-scope="{ item }"> <u-list-item>{{ item.content }}</u-list-item> </template> </u-list> </div> </template> ``` 2. **初始化数据**: 定义总数据数(`totalCount`)、当前页数和已加载的数据(假设初始有一页数据)。 ```javascript export default { data() { return { totalCount: 0, currentPage: 1, isLoading: false, // 假设初始有一组数据 dataList: [/*...*/], }; }, computed: { // 总数据数等于所有加载过的数据数量 pageCount() { return Math.ceil(this.dataList.length / this.pageSize); } }, methods: { loadMoreData(page) { this.isLoading = true; // 加载下一页数据,并更新总数据数 const pageSize = 10; // 每页数量 const start = (page - 1) * pageSize; const end = start + pageSize; if (end > this.totalCount) { // 如果已经加载完所有数据 this.isLoading = false; return; } fetchNewData(start, end).then(response => { const newItems = response.data; // 假设fetch返回新的数据 this.dataList = [...this.dataList.slice(0, start), ...newItems]; this.totalCount = this.dataList.length; this.currentPage = page; this.isLoading = false; }); }, }, }; ``` 3. **处理分页请求**: `loadMoreData`方法内部,你需要根据实际API设计来获取新的数据。例如,这里用了`fetchNewData`函数作为示例,你需要替换为你应用中的实际数据加载逻辑。 记得在项目中注册UView库并按照官方文档配置才能正常使用这些组件。如果你遇到问题,UView的官方文档和社区支持会很有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值