使用vue+element实现表格的分页功能,纯前端版

表格用的element官网的样式,外面的div没什么作用,可以自行删除!这个标签就是分页的标签了,也是element上的分页模板!下面的是模板代码

<template>
    <div>
        <!--<el-button style="" type="primary" @click="addRow(tableData)" icon="el-icon-plus">增加</el-button>-->
        <!-- Form -->
        <el-button type="text" @click="dialogFormVisible = true">打开嵌套表单的 Dialog</el-button>

        <el-dialog title="收货地址" :visible.sync="dialogFormVisible">

            <el-form status-icon label-width="100px" class="demo-ruleForm">
                <el-form-item label="密码" prop="pass">
                    <el-input type="password" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="确认密码" prop="checkPass">
                    <el-input type="password" autocomplete="off"></el-input>
                </el-form-item>
                <el-form-item label="年龄" prop="age">
                    <el-input></el-input>
                </el-form-item>
                <el-form-item>
                    <el-button type="primary">提交</el-button>
                    <el-button>重置</el-button>
                </el-form-item>
            </el-form>

            <div slot="footer" class="dialog-footer">
                <el-button @click="dialogFormVisible = false">取 消</el-button>
                <el-button type="primary" @click="dialogFormVisible = false">确 定</el-button>
            </div>
        </el-dialog>
        <el-table
                :data="tableData"
                style="width: 100%">
            <el-table-column
                    prop="id"
                    label="编号"
                    width="180"
            >
            </el-table-column>

            <el-table-column
                    prop="name"
                    label="姓名"
                    width="180">
            </el-table-column>
            <el-table-column
                    prop="sex"
                    label="性别">
            </el-table-column>
            <el-table-column
                    prop="sum"
                    label="消费金额"
                    sortable>
            </el-table-column>
            <el-table-column
                    prop="count"
                    label="消费次数">
            </el-table-column>
            <el-table-column
                    prop="phone"
                    label="手机号码">
            </el-table-column>
            <el-table-column
                    prop="button"
                    label="操作">
                <template>
                    <el-button type="primary" icon="el-icon-scissors"></el-button>
                    <el-button type="primary" icon="el-icon-delete" @click="deleteTable(index,tableData)"></el-button>
                </template>
            </el-table-column>
        </el-table>
        <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                hide-on-single-page
                background
                :page-size="pageSize"
                layout="prev, pager, next"
                :current-page="pageIndex"
                :total="total">
        </el-pagination>
    </div>
</template>

下面是Script代码,

<script>
    export default {
        name: "Table",
        data() {
            return {
              // 表格所展示的数据存在这里,只要这里的数据发生改变,表格的内容就会展示对应的数据
                tableData: [{
                    id: 'c1',
                    name: '王小虎',
                    sex: '女',
                    sum: '2343',
                    count: '55',
                    phone: '15556886356'
                }],
                total: 10, // 数据的总条数
                pageIndex: 1, //当前页面显示的页码
                pageSize: 10, // 每页显示的数据条数
            
                // 这里是模态框需要的属性和模态框内需要的from元素,请忽略!
                dialogTableVisible: false,
                dialogFormVisible: false,
                form: {
                    name: '',
                    region: '',
                    date1: '',
                    date2: '',
                    delivery: false,
                    type: [],
                    resource: '',
                    desc: ''
                },
                // 存储数据的对象,获取到的数据存储到这里,方便分页方法的使用
                tableTemp:{

                },
            }
        },
        methods: {
            deleteTable(index, rows) {// 删除当前行,页面上那个删除小图标的事件,点击后删除当前行,**注意**删除的是行不是数据,页面刷新后数据还是在的!
                rows.splice(index, 1);//删掉该行
            },
            // 当每页显示的数据条数发发生改变时(pageSize),触发此方法
            handleSizeChange(pageSize) {
                this.pageSize = pageSize;
                this.handleCurrentChange(this.pageIndex);
            },
            // 当前页面显示的页码发生改变时(pageIndex),触发此方法
            // 用户点击页码或者上一页 下一页的按钮时,都会使pageIndex发生改变
            handleCurrentChange(pageIndex) {
                this.pageIndex = pageIndex;
                // 这里传的是temp对象,因为这个是最原始的数据,是没有改变过的
                this.currentChangePage(this.tableTemp, pageIndex);
            },
             // 分页的实现方法,data是需要分割的原始数据,pageIndex是当前页面选中的分页下标
            currentChangePage(data, pageIndex) {
                // 分页开始的下标
                let i = (pageIndex - 1) * this.pageSize;// 当前页面选中的分页下标-1 * 展示的数据的条数
                // 分页结束的下标
                let sum = pageIndex * this.pageSize;// 当前页面选中的分页下标 * 展示的数据的条数
                // 让原有的数据清空,原有的数据有一个王小虎在哪里,所以清空掉!
                this.tableData = [];
                // 这一段就是分页的核心代码,利用for循环和计算出来的下标,实现数据的分割!
                for (; i < sum; i++) {
                    this.tableData.push(data[i]);
                }

            }
        },

        // 在渲染页面前执行的函数方法,这个方法里面不能使用this
        // 这个方法是路由的守卫里面的
        beforeRouteEnter(to, from, next) {
            // 回调函数,这里的next是最后才运行的,ajax一般都写在这里面
            next(vm => { // vm在这里的指的就是this,也就是当前组件的实例
                // 进入页面后,使用ajax获取数据,然后进行展示
                vm.$ajax({
                    method: 'get',
                    url: 'data/table-data.json',
                    responseType: 'json'
                })
                // axios(也就是$.ajax)的回调函数,获得的数据都是在回调函数里面
                    .then(function (response) {
                        // 因为一进来就要实现只展示10个数据,所以不用赋值给表格的数组变量!
                        // 直接赋值给临时存储数据的变量然后调用分页的方法就好了!
                        vm.tableTemp = response.data.data;
                        vm.total = response.data.total;
                        vm.pageIndex = response.data.pageIndex;
                        vm.pageSize = response.data.pageSize;
                        // 一进来就要只加载10个数据,所以直接调用分页方法,只展示10个数据!
                        vm.currentChangePage(vm.tableTemp,vm.pageIndex);

                    })
            })
        }
    }
</script>

用到的路由守卫连接
beforeRouteEnter方法解释:在渲染该页面的element组件之前调用的方法,因为这个时候组件的实例还没有创建好,所以无法使用在方法里面使用this,而next方法为他的回调方法,(你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数)也就是在next方法里面可以使用this,也就是上面方法里面的vm

下面的就是我的json文件里面的数据!,因为要进行分页,所以需要足够多的数据!

{
  "total":29,
  "pageIndex":1,
  "pageSize":10,
  "pages":10,
  "pageLinkCount":5,
  "data":[{
    "id":"c1","name":"小白","sex":"女","sum":"50011","count":"56","phone":"15556886356"
  },{
    "id":"c2","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c3","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c4","name":"小白","sex":"女","sum":"50018","count":"56","phone":"15556886356"
  },{
    "id":"c5","name":"小白","sex":"女","sum":"500","count":"56","phone":"15556886356"
  },{
    "id":"c6","name":"小白","sex":"女","sum":"5012","count":"56","phone":"15556886356"
  },{
    "id":"c7","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c8","name":"小白","sex":"女","sum":"500012","count":"56","phone":"15556886356"
  },{
    "id":"c9","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c10","name":"小白","sex":"女","sum":"150012","count":"56","phone":"15556886356"
  },{
    "id":"c11","name":"小白","sex":"女","sum":"550012","count":"56","phone":"15556886356"
  },{
    "id":"c12","name":"小白","sex":"女","sum":"500012","count":"56","phone":"15556886356"
  },{
    "id":"c13","name":"小白","sex":"女","sum":"505012","count":"56","phone":"15556886356"
  },{
    "id":"c14","name":"小白","sex":"女","sum":"500812","count":"56","phone":"15556886356"
  },{
    "id":"c15","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c16","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c17","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c18","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c19","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c20","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c21","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c22","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c23","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c24","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c25","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c26","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c27","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c28","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  },{
    "id":"c29","name":"小白","sex":"女","sum":"50012","count":"56","phone":"15556886356"
  }
  ]

}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值