Vue2.0 + Element-ui2实现分页

news/2024/7/10 3:04:43 标签: vue, element

当我们向服务端请求大量数据的时候,并要在页面展示出来,怎么办?这个时候一定会用到分页。

本次所使用的是vue2.0+element-ui2.12实现一个分页功能,element-ui这个组件特别丰富,它给我提供了很多Pagination分页方式,这里使用其中一个快速完成分页功能。

最终效果展示:

下面说说实现原理及附上完整的代码,包括服务端代码(python)。 

<template>
    <div>
        <el-table
          :data="tableData"
          border
          style="width: 100%">
          <el-table-column
            type="selection"
            width="55">
          </el-table-column>
          <el-table-column
            label="标题"
            prop="title"
            width="680">
          </el-table-column>
          <el-table-column
            label="日期"
            prop="date"
            width="180">
          </el-table-column>
          <el-table-column label="操作">
            <template slot-scope="scope">
              <el-button
                size="mini"
                @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
              <el-button
                size="mini"
                type="danger"
                @click="handleDelete(scope.$index, scope.row)">删除</el-button>
            </template>
          </el-table-column>
        </el-table>

        <el-row>
          <el-col :span="24">
            <div style="padding-top: 20px;">
              <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="currentPage"
                :page-sizes="[5, 10, 50, 100]"
                :page-size="pagesize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total">
              </el-pagination>
            </div>
          </el-col>
        </el-row>
    </div>
</template>

 页面中的当前数据、分页中的当前页码、每页显示的数据条数及数据总条数需要先在data中定义:

    data() {
      return {
        tableData: [],
        currentPage: 1,
        pagesize: 10,
        total: 0
      }
    }

页面中的实际数据需要通过异步的方式从后台读取,这里使用的是axios,methods中后面两个函数是分页用到的,作用是什么?代码中有说明:

methods: {
      getList(){
          let that = this;
          let param = new URLSearchParams();
          param.append('pageSize', this.pagesize);
          param.append('pageNumber', this.currentPage);
          that.$axios({
            method: 'post',
            url: 'http://localhost:9999/article/all_post/',
            data: param
          })
          .then(function(res){
            console.log(res);
            let len = res.data.rows.length;
            that.total = res.data.total;
            that.tableData = [];
            for(let i = 0; i<len; i++){
                that.tableData.push({
                  id: res.data.rows[i].id,
                  title: res.data.rows[i].title,
                  date: res.data.rows[i].create_time,
                  desc: res.data.rows[i].content
                });
            }
          })
          .catch(function(err){
            that.$message(err);
          })
      },
      handleSizeChange: function (size) {
              this.pagesize = size;
              this.getList();
              console.log(this.pagesize)  //每页下拉显示数据
      },
      handleCurrentChange: function(currentPage){
              this.currentPage = currentPage;
              console.log(this.currentPage)  //点击第几页
              this.getList();
      }
    },
    mounted(){
        this.getList();
    }

服务端代码如下(通过django实现):

@csrf_exempt
def all_post(request):
    if request.method == 'POST':
        pageSize = int(request.POST.get('pageSize'))
        pageNumber = int(request.POST.get('pageNumber'))
        searchText = request.POST.get('searchText')
        sortName = request.POST.get('sortName')
        sortOrder = request.POST.get('sortOrder')

    total = Article.objects.all().count()
    articles = Article.objects.order_by('-id')[(pageNumber - 1) * pageSize:(pageNumber) * pageSize]
    print(articles)
    rows = []
    data = {"total": total, "rows": rows}
    for article in articles:
        rows.append(
            {'id': article.id, 'title': article.title, 'content': article.content, 'create_time': article.create_time})

    return HttpResponse(json.dumps(data, cls=CJsonEncoder), content_type="application/json")

 


http://www.niftyadmin.cn/n/886791.html

相关文章

vue中的$event

一、表示事件对象&#xff1a; <input :value"message" input"message$event.target.value"> let app new Vue({el: "#app",data: {message: 初始值} }) 二、在子父组件通信时接收子组件抛出的值&#xff1a; 子组件模板内容&#xf…

关于vue.js的props里“禁用特性继承”的理解

首先假设如今有一个组件<base-input></base-input>,创建改组件式的代码如下&#xff1a; Vue.component("base-input", {inheritAttrs: false, //此处设置禁用继承特性props: ["label"],template: <label>{{ label }}<inputv-bind&q…

完全由前端实现的超时时跳转到登录页(或其它页面)

var lastTime new Date().getTime(); var currentTime new Date().getTime(); var timeOut 1*60*1000; //设置超时时间&#xff1a; 1分// 鼠标移动事件 $(document).mousemove(function(){lastTime new Date().getTime(); //更新操作时间 });// 定时器 间隔1秒检测是否长时…

web实现断点续传

普通单文件上传&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>断点续传</title></head> <body> <div id"app"><input type"file" i…

ztree点击树节点前的展开图标分级加载下拉树

onExpand&#xff1a;用于捕获节点被展开的事件回调函数&#xff0c;这个是关键。 <ul id"share-to-department-modal-tree"></ul> var fileTreeSettingForShareToDept {check : {enable : true,chkboxType : {"Y" : "","N&…

理解 Go make 和 new 的区别

Go语言中new和make是内建的两个函数&#xff0c;主要用来创建分配类型内存。在我们定义生成变量的时候&#xff0c;可能会觉得有点迷惑&#xff0c;其实他们的规则很简单&#xff0c;下面我们就通过一些示例说明他们的区别和使用。 变量的声明 var i int var s string变量的声…

怎么理解vue中$listeners属性?

首先&#xff0c;$listeners是什么&#xff1f; 假设有父组件Parent和子组件Child // Parent <template>...<child v-on:event-one"methodOne" v-on:event-two"methodTwo" />... </template> 那么你在使用Child时&#xff0c;传入的所…

vue实例之组件开发:图片轮播组件

一、普通方式&#xff1a; 其中&#xff0c;index是关键。 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <style> html, body{margin: 0;padding: 0; } .photo-player{width: 456px;height: 670px;over…