1.安装mock
npm install mockjs
2.mock实现表格数据的分页
文件的截图
实现页面以角色页面为例子,具体的样式需要自己实现
<template>
<div style="height: 100%; width: 100%">
<div style="display: flex; justify-content: space-between; height: 30px">
<el-input
size="mini"
style="width: 200px"
placeholder="请输入内容"
v-model="searchKey"
class="input-with-select"
>
<el-button size="mini" slot="append" icon="el-icon-search"></el-button>
</el-input>
<el-button size="mini" type="primary">
<i class="el-icon-plus"></i>
新增</el-button
>
</div>
<el-table :data="tableData" style="width: 100%">
<el-table-column label="序号" prop="id"> </el-table-column>
<el-table-column label="角色名称" prop="role"> </el-table-column>
<el-table-column label="启用状态" prop="status">
<template slot-scope="scope">
<div v-if="scope.row.status">已启用</div>
<div v-else>未启用</div>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="createTime"> </el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNum"
:page-sizes="[10, 20, 30, 40]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</div>
</template>
<script>
import editDialog from "./components/edit-dialog.vue";
import { getRoleListApi } from "@/api/role-manage";
export default {
name: "RoleManage",
components: {
editDialog,
},
data() {
return {
searchKey: "",
tableData: [],
editShow: false,
total: 0,
pageNum: 1,
pageSize: 20,
};
},
created() {
this.getList();
},
methods: {
getList() {
let params = {
searchKey: this.searchKey,
pageNum: this.pageNum,
pageSize: this.pageSize,
};
getRoleListApi(params).then((res) => {
console.log(res);
this.tableData = res.roleData;
this.total = res.total;
});
},
handleSizeChange(val) {
this.pageSize = val;
console.log(`每页 ${val} 条`);
this.getList();
},
handleCurrentChange(val) {
this.pageNum = val;
console.log(`当前页: ${val}`);
this.getList();
},
},
};
</script>
<style lang="less" scoped>
.el-table {
height: calc(100% - 65px);
}
.el-pagination {
text-align: right;
}
</style>
在mock文件夹中创建文件role-manage.js,并把文件在main.js中引入(不引入是无法调用接口)
// 引入mockjs
import Mock from 'mockjs'
// mock方法--三个参数
// 1. 拦截请求地址
// 2. 请求方式
// 3. 返回数据
// 形式:1直接返回数据 2函数返回数据
// 直接返回数据
// 表格中初始的数据
这里为了测试分页,只修改id,其他数据重复
var roleListArr=[{
id: "1",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "2",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
},
{
id: "3",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "4",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
},
{
id: "5",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "6",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
},
{
id: "7",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "8",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
},{
id: "9",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "10",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
},{
id: "11",
role: "系统管理员",
des: "系统管理员拥有所有权限",
status: true,
createTime: "2023-11-08",
},
{
id: "12",
role: "普通用户",
des: "普通用户仅可查看数据页面",
status: true,
createTime: "2023-11-08",
}];
// 定义返回的数据
let dataRes = function(options){
// 获取调用接口时传过来的数据
// 传过来的数据有pageNum(第几页), pageSize(每页显示几条),searchKey(搜索关键字)
let info = JSON.parse(options.body);
// 搜索关键字,通过它对表格数据进行筛选
// 示例:对角色名称进行筛选
// 需要注意的是我们筛选数据的时候,是不能破坏原始的数据
const searchKey = info.searchKey;
const pageNum = info.pageNum;
const pageSize = info.pageSize;
let newArr = [];
if (roleListArr.length > 0) {
// 从第几个数据开始返回
// 比如需要展示的是第二页的数据,那么开始的数据就是第一页的数据*每页个数
// 那么展示第x页的数据,那么返回的开始数据就是 第x-1页*每页个数,得到前面几页共有多少条数据
let pageStarNum = (pageNum -1) * pageSize;
// 该页结束的个数
let num = pageNum * pageSize;
// 以第二页,一页10个为例(这里循环的就是11-20)
for (let i = pageStarNum; i < num; i++) {
// 如果没有数据了,就跳出循环不需要往返回的数据中添加了,以免报错
if(roleListArr[i]){
newArr.push(roleListArr[i]);
}else{
break;
}
}
}
let total = roleListArr.length;
let data={
roleData:newArr,
total:total,
}
return {
code: 200,
msg:"获取数据成功",
data:data
}
}
Mock.mock('/api/data/getRoleListApi','post',dataRes )
在api文件夹中创建role-manage.js,用来封装数据,也可以不封装直接调用,但是个人喜欢封装axios之后,封装接口再调用,这样出现问题会更好解决。如果没有这一步,可以直接通过axios调用接口。
// 这个request就是我封装的axios
import request from '../utils/require';
export function getRoleListApi(params) {
return request.post("/api/data/getRoleListApi",params);
}
3.mock实现对表格数据的查询
对页面的搜索按钮添加点击事件,点击时重新获取表格数据
<div style="display: flex; justify-content: space-between; height: 30px">
<el-input
size="mini"
style="width: 200px"
placeholder="请输入内容"
v-model="searchKey"
class="input-with-select"
>
<el-button
size="mini"
slot="append"
@click="searchList"
icon="el-icon-search"
></el-button>
</el-input>
<el-button size="mini" type="primary">
<i class="el-icon-plus"></i>
新增</el-button
>
</div>
methods:{
searchList() {
// 这里需要注意的是,搜索的时候,需要把分页的下标至为1,
//因为符合搜索条件的数据可能不够一页,如果少于一页的个数,
//此时pageNum不是1时,表格不会显示数据
this.pageNum = 1;
this.getList();
},
}
我们对接口也需要进行一些修改
let dataRes = function(options){
// 获取调用接口时传过来的数据
// 传过来的数据有pageNum(第几页), pageSize(每页显示几条),searchKey(搜索关键字)
let info = JSON.parse(options.body);
// 搜索关键字,通过它对表格数据进行筛选
// 示例:对角色名称进行筛选
// 需要注意的是我们筛选数据的时候,是不能破坏原始的数据
const searchKey = info.searchKey;
const pageNum = info.pageNum;
const pageSize = info.pageSize;
let newArr = [];
let total = 0;
if (roleListArr.length > 0) {
// 从第几个数据开始返回
// 比如需要展示的是第二页的数据,那么开始的数据就是第一页的数据*每页个数
// 那么展示第x页的数据,那么返回的开始数据就是 第x-1页*每页个数,得到前面几页共有多少条数据
let pageStarNum = (pageNum -1) * pageSize;
// 该页结束的个数
let num = pageNum * pageSize;
// 已是否有搜索关键字来区分
if(searchKey == ""){
// 以第二页,一页10个为例(这里循环的就是11-20)
for (let i = pageStarNum; i < num; i++) {
// 如果没有数据了,就跳出循环不需要往返回的数据中添加了,以免报错
if(roleListArr[i]){
newArr.push(roleListArr[i]);
}else{
break;
}
}
// 如果没有查询条件,那么total就是初始化数据的总条数
total = roleListArr.length;
}else{
// 用来存放符合条件的数据
let searchList = [];
for (let i = 0; i < roleListArr.length; i++) {
// 对角色名称进行查询
if (searchKey && roleListArr[i].role.indexOf(searchKey)>-1) {
console.log("查询条件:"+searchKey)
searchList.push(roleListArr[i]);
}
}
// 这里判断符合条件的数组是否超过一页可以展示的条数,若超过就至展示展示的条数
// 若没超过展示所有内容即可
if(searchList.length>pageSize){
for (let i = pageStarNum; i < num; i++) {
if(searchList[i]){
newArr.push(searchList[i]);
}else{
break;
}
}
}else{
newArr = searchList;
}
// 如果有查询条件,那么total就是符合查询条件数据的总条数
total = searchList.length;
}
}
let data={
roleData:newArr,
total:total,
}
return {
code: 200,
msg:"获取数据成功",
data:data
}
}
Mock.mock('/api/data/getRoleListApi','post',dataRes )