<!--
dataList: 表格数据
columnList: 表头字段 宽度minWidth
使用slotName字段: 需要对列数据进行处理,不写prop字段,使用slotName字段
btnText<String>: 按钮字段
btnIcon<String>: 按钮的icon
btnEvent: 按钮事件
btnType: 按钮类型
getHeight<String>: 表格高度
pagination: 分页回调方法
formItemList: 查询条件List -----label字段名 type类型(select、input、daterange、cascader)
select(selectOptions下拉框数据、defaultSelect下拉框默认选中数据)
cascader(options级联选择框数据) param(用来接收查询参数)
search: 查询事件
isAddBtn: 是否显示添加按钮
-->
<template>
<div class="app-container">
<el-form
:inline="true"
ref="ruleForm"
:model="formInline"
class="demo-form-inline"
>
<el-form-item
v-for="(item, index) in formItemList"
:key="index"
:label="item.label"
>
<!-- 下拉选择框 -->
<el-select
v-if="item.type == 'select'"
v-model="formInline[item.param]"
:multiple="item.multiple"
placeholder="请选择"
size="mini"
clearable
>
<el-option
v-for="(item2, index2) in item.selectOptions"
:key="index2"
:label="item2.dictLabel"
:value="item2.dictValue"
></el-option>
</el-select>
<!-- 下拉选择框end -->
<!-- 输入框 -->
<el-input
v-if="item.type == 'input'"
v-model="formInline[item.param]"
size="mini"
placeholder="请输入"
clearable
></el-input>
<!-- 输入框 -->
<!-- 日期范围选择框 -->
<el-date-picker
v-if="
item.type == 'daterange' ||
item.type == 'datetimerange' ||
item.type == 'date' ||
item.type == 'datetime'
"
v-model="formInline[item.param]"
:value-format="item.valueFormat || 'yyyy-MM-dd hh:mm:ss'"
:format="item.format || 'yyyy-MM-dd hh:mm:ss'"
clearable
:type="item.type || ''"
:range-separator="item.rangeSeparator || '至'"
:start-placeholder="item.startPlaceholder"
:end-placeholder="item.endPlaceholder"
placeholder="请选择"
size="mini"
>
</el-date-picker>
<!-- 日期范围选择框end -->
<!-- 级联选择器 -->
<el-cascader
v-if="item.type == 'cascader'"
v-model="formInline[item.param]"
size="mini"
:options="item.options"
:props="item.props"
clearable
></el-cascader>
<!-- 级联选择器end -->
</el-form-item>
<slot name="formItem"></slot>
<el-form-item style="width:10rem">
<el-button type="primary" size="mini" @click="onSubmit">查询</el-button>
<el-button type="" size="mini" @click="resetForm('ruleForm')"
>重置</el-button
>
</el-form-item>
<!-- 可用于显示其他按钮 -->
<el-form-item style="width:10rem" v-if="isAddBtn">
<el-button :type="btnType" :icon="btnIcon" @click="btnEvent">{{ btnText }}</el-button>
</el-form-item>
</el-form>
<el-table
ref="table"
v-loading="loading"
:data="dataList"
:height="getHeight"
stripe
:header-cell-style="headerCellStyle"
>
<el-table-column label="序号" align="center" width="50" type="index" />
<el-table-column
v-for="(item, index) in columnList"
ref="table"
:label="item.label"
:key="index"
:prop="item.prop"
:fixed="item.fixed"
:min-width="item.minWidth"
align="center"
>
<template slot-scope="scope">
<slot v-if="item.slotName" :name="item.slotName" :row="scope.row"></slot>
<div v-else>{{scope.row[item.prop]}}</div>
</template>
</el-table-column>
</el-table>
<div class="tabListPage">
<el-pagination
small
class="text-center"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="page.page"
:page-sizes="pageSizes"
:page-size="page.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
ref="pagination"
>
</el-pagination>
</div>
</div>
</template>
<script>
export default {
data(){
let formInline = {};
for (const obj of this.formItemList) {
formInline[obj.param] = obj.defaultSelect || "";
}
return{
formInline,
loading:false,
headerCellStyle:{background:'#4d5564',textAlign:'center',flexWrap:'wrap',color:'#fff',fontWeight:'600'},
pageSizes: [10, 20, 50, 100],
page: {
page: 1,
limit: 10,
},
}
},
props:{
dataList:{
type:Array,
},
columnList:{
type:Array,
},
btnText:{
type:String,
default:'增加'
},
btnIcon:{
type:String,
default:'el-icon-plus'
},
getHeight:{
type:String,
default:'730'
},
total: {
type: Number,
},
btnType:{
type:String,
default:'primary'
},
isAddBtn:{
type:Boolean,
default: true
},
formItemList: {
type: Array,
default() {
return [
{
label: "下拉框",
type: "select",
selectOptions: [{ text: 111, value: 111 }],
param: "company",
defaultSelect: "222",
multiple: false
},
{
label: "输入框",
type: "input",
param: "name"
},
];
}
}
},
watch: {
formItemList: {
handler(newVal, oldVal) {
for (const obj of this.formItemList) {
if (obj.defaultSelect) {
this.formInline[obj.param] = obj.defaultSelect;
}
}
},
deep: true
},
total(newdata, olddata) {
if (newdata != olddata) {
this.$refs.pagination.internalCurrentPage = 1;
this.page.limit = 10;
}
},
},
methods:{
btnEvent(){
this.$emit('btnEvent', );
},
handleSizeChange(val) {
this.page.limit = val;
this.page.page = 1;
this.$emit("pageChange", this.page);
},
handleCurrentChange(val) {
this.page.page = val;
this.$emit("pageChange", this.page);
},
onSubmit() {
this.$emit("search", this.formInline);
},
resetForm(formName) {
this.$refs[formName].resetFields();
let formInline = {};
for (const obj of this.formItemList) {
formInline[obj.param] = "";
}
this.formInline = formInline;
this.$emit("search", this.formInline);
}
}
}
</script>
<style>
.headerBox{
display: flex;
justify-content: flex-end;
align-items: center;
margin-bottom: 10px;
}
.tabListPage{
display: flex;
justify-content: flex-end;
align-items: center;
margin-top: 10px;
}
</style>

- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286