混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。
一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。
web 应用免不了要和表格打交道,特别是管理类或者后台类的应用。
多个组件可能都包含有表格组件,但是逻辑基本都一样,比如表格分页、分页数量调整等等操作,这个时候就适用混入来实现。
技术栈使用 Vue 项目 + elementUI
在 src 目录下新建 mixins 目录,统一管理混入 js。
然后在该目录下新建 pageMixin.js
pageMixin.js
export const pageMixin = {
data() {
return {
url: '',
queryData: {
currPage: 1,
pageSize: 10
},
tableData: {
rows: [],
total: 0
},
loading: false, // 加载列表数据的Loading
pageSizes: [10, 20, 30, 50, 100], // 每页行数列表,用于切换每页行数
layout: "total, sizes, prev, pager, next, jumper" // Element表格组件中使用的功能
}
},
methods: {
// 查询列表数据
getList() {
this.$axios.get(this.url, {
params: this.queryData
}).then(res => {
this.tableData = res.data;
});
},
// 修改当前页
handleCurrentChange(currPage) {
this.queryData.currPage = currPage;
this.getList();
},
// 修改每页行数
handleSizeChange(pageSize) {
this.queryData.currPage = 1;
this.queryData.pageSize = pageSize;
this.getList();
},
},
}
组件引入
<template>
<div>
<el-table :data="tableData.rows">
<el-table-column prop="userID" label="ID" width="180"></el-table-column>
<el-table-column prop="account" label="账号" width="180"></el-table-column>
<el-table-column prop="password" label="密码"></el-table-column>
</el-table>
<div style="text-align:left;margin:10px">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:page-sizes="pageSizes"
:page-size="pageSizes[0]"
background
:layout="layout"
:total="tableData.total"
></el-pagination>
</div>
</div>
</template>
<script>
import { pageMixin } from "@/mixins/pageMixin";
export default {
name: "HelloWorld",
mixins: [pageMixin],
data() {
return {
url: "/api/user/list"
};
},
components: {},
mounted() {
this.getList();
},
methods: {}
};
</script>
因各个组件的请求列表 api 不一致,需要对应设置接口变量。
当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”,发生冲突时以组件数据优先。
有些组件可能有多条件查询,而且各个 api 查询字段都不一样。
这时候在组件中可以设置 queryData 参数。
data() {
return {
queryData: {
title: ""
},
url: "/api/user/list"
};
},
这时候接口查询时会加上 title 参数。