之前一直在后端进行分页,使用的java中的pageHelper分页插件,但是用起来不是感觉很好。
原因是:搜索和加载全部数据时,要区别是是搜索还是加载数据列表的状态。
如果使用前端分页,则没有这个问题。不闲聊,直接上代码---->
export default {
    data() {
        return {
            form: {
                searchContent: null
            },
            tableData: [],      // table数据列表
            totalPageData: [],  // 分页数据(全部数据已经分好页)
            pageNum: 1,         // 共几页
            pageSize: 10,        // 每页显示数量
            currentPage: 1,     // 当前显示页码
            total: 1,           // 总共多少条数据
            dataShow: [],       // 当前页要显示的数据
            
        };
    },
    created() {
        // this.fetchData();
        this.getTableData();

    },
    methods: {
        tableRowClassName({row, rowIndex}) {
            if (rowIndex % 2 == 1) {
                return "success-row";
            }
            return "";
        },

        // 获取table列表的信息
        getTableData() {
            this.$axios({
                url: "/api/kpi/intellectual/list",
                // url: "/kpi/intellectual/list",
                method: "get",
            }).then(response => {
                const resp = response.data.data;
                this.tableData = resp;
                this.total = resp.length;
                this.calcPageData();
            }).catch(error => {
                this.$message.error("数据加载失败!")
            })
            
        },
        search() {
            // 搜索时初始化参数
            this.pageSize = 10;
            this.currentPage = 1;
            const data = {
                "content": this.form.searchContent
            }
            if (data.content == null || data.content == '') {
                this.$message({
                    type: "warning",
                    message: "搜索内容不能为空!"
                })
                return ;
            }
            this.$axios({
                url: "/api/kpi/intellectual/search",
                // url: "/kpi/intellectual/search",
                method: "post",
                data: data
            }).then(response => {
                const resp = response.data;
                // console.log("resp: " + JSON.stringify(resp))
                this.tableData = resp.data;
                this.total = resp.data.length;
                this.calcPageData();
            }).catch(error => {
                this.$message.error("搜索的内容不存在!")
            })
        },
        // 计算页数的方法
        calcPageData() {
            // 计算页数,根据后台数据的条数和每页要显示的数量算出一共多少页,得0时设为1
            if(this.tableData.length > 1) {
                this.pageNum = Math.ceil(this.tableData.length / this.pageSize) || 1;
                // console.log("总页数:" + this.pageNum);
            }
            //数据分组
            for (let i = 0; i < this.pageNum; i++) {
                // 每页相当于一个数据,例如:[[],[],[]]
                // 根据每页显示数量,将后台的数据分割到每一页,假设pageSize为5,则第一也为1-5条slice(0,5),slice(5,10)...
                this.totalPageData[i] = this.tableData.slice(this.pageSize * i, this.pageSize * (i+1));
            }

            // 获取到数据后显示第一页内容,数组下标是从0开始的,这里一定 要减去1,不然会丢失一组数据
            this.dataShow = this.totalPageData[this.currentPage - 1];
        },
        handleSizeChange(val) {
            this.pageSize = val;
            // console.log("一页显示多少条:" + val);
            // 重新计算页数并分组
            this.calcPageData();
        },

        handleCurrentChange(val) {
            this.currentPage = val;
            // 注意数组是从0开始,页码别忘了减去1
            this.dataShow = this.totalPageData[val - 1];
            // console.log("第几页: " + val)
        },
        //页面显示条数改变是触发
        handleSizeChange1(val) {
            this.pageSize = val;
            //重新加载数据
            this.fetchData();
        },
        //点击分页的页码时触发
        handleCurrentChange1(val) {
            this.currentPage = val;
            //重新加载数据
            this.fetchData();
        },
        
        // 重置时重新加载数据,每页条数,以及当前页需要初始化
        reset() {
            this.getTableData();
            this.pageSize = 10;
            this.currentPage = 1;
            this.form.searchContent = null;
        }
    },
    filters: {
        //文件提交的状态
        stateFilter(type) {
            const sF = state.find(obj => obj.type === type);
            return sF ? sF.name : null;
        },
    }
};

前端代码部分:

<saice-row>
    <saice-table 
        :data="dataShow" 
        style="width: 100%;" 
        border 
        :row-class-name="tableRowClassName"
        :header-cell-style="{background:'#eef1f6', color: '#606266'}">
        <saice-table-column type="index" label="序号" width="60"></saice-table-column>
        <!-- <saice-table-column prop="businessId" label="业务标识" width=""></saice-table-column> -->
        <saice-table-column prop="typeName" label="知识产权类型" sortable>
        </saice-table-column>
        <saice-table-column prop="fileName" label="文件名称" sortable>
            <template slot-scope="scope">
                <a :href="'/api/kpi/intellectual/download?id='+scope.row.fileId">{{scope.row.fileName}}</a>
            </template>
        </saice-table-column>
        <saice-table-column prop="name" label="申请人" sortable></saice-table-column>
        <saice-table-column prop="participateUser" label="参与人" sortable></saice-table-column>
        <saice-table-column prop="applyDate" label="申请时间" sortable></saice-table-column>
        <!-- <saice-table-column prop="assessName" label="审核人" sortable></saice-table-column> -->
        <!-- <saice-table-column prop="assessDate" label="审核时间" sortable></saice-table-column> -->
        <saice-table-column prop="state" label="状态" width="100">
            <template slot-scope="scope">
                <saice-tag type="primary">
                    <span>{{ scope.row.state | stateFilter }}</span>
                </saice-tag>
            </template>
        </saice-table-column>
    </saice-table>
</saice-row>

<!-- 分页 -->
<saice-row style="margin-top: 8px; margin-bottom: 10px; height: 30px;">
    <saice-col :span="12" :offset="0">
        <!-- pageSize(每页条数),改变时会触发 
            currentPage(当前页)改变时会触发
        -->
        <saice-pagination
            @size-change="handleSizeChange" 
            @current-change="handleCurrentChange"
            :current-page="currentPage"
            :page-sizes="[10, 20, 50]"
            :page-size="pageSize"
            layout="total, sizes, prev, pager, next, jumper"
            :total="total">
        </saice-pagination>
    </saice-col>
</saice-row>

需要注意的是:
table表显示的数据是dataShow,指的是当前的数据,所以你在给表赋值的时候别弄错了,–>:data="dataShow"

上面代码比较长,不必关注其余的代码,只需要将前端分页的函数学会即可。