ProTable组件支持自定义搜索表单

This commit is contained in:
zsen hu 2021-09-29 15:09:22 +08:00
parent f08fac197a
commit 094899bc12

View File

@ -22,7 +22,7 @@
* @version: * @version:
* @Date: 2021-04-20 11:06:21 * @Date: 2021-04-20 11:06:21
* @LastEditors: huzhushan@126.com * @LastEditors: huzhushan@126.com
* @LastEditTime: 2021-04-21 12:45:46 * @LastEditTime: 2021-09-29 15:04:03
* @Author: huzhushan@126.com * @Author: huzhushan@126.com
* @HomePage: https://huzhushan.gitee.io/vue3-element-admin * @HomePage: https://huzhushan.gitee.io/vue3-element-admin
* @Github: https://github.com/huzhushan/vue3-element-admin * @Github: https://github.com/huzhushan/vue3-element-admin
@ -38,7 +38,7 @@
class="search" class="search"
:model="searchModel" :model="searchModel"
:inline="true" :inline="true"
label-position="left" label-position="right"
:label-width="search.labelWidth" :label-width="search.labelWidth"
ref="searchForm" ref="searchForm"
> >
@ -48,8 +48,9 @@
:label="item.label" :label="item.label"
:prop="item.name" :prop="item.name"
> >
<slot v-if="item.type === 'custom'" :name="item.slot" />
<el-select <el-select
v-if="item.type === 'select'" v-else-if="item.type === 'select'"
v-model="searchModel[item.name]" v-model="searchModel[item.name]"
:filterable="!!item.filterable" :filterable="!!item.filterable"
:multiple="!!item.multiple" :multiple="!!item.multiple"
@ -171,6 +172,7 @@
/> />
<el-input <el-input
v-else-if="item.type === 'textarea'" v-else-if="item.type === 'textarea'"
:maxlength="item.maxlength"
type="textarea" type="textarea"
clearable clearable
v-model="searchModel[item.name]" v-model="searchModel[item.name]"
@ -179,6 +181,7 @@
></el-input> ></el-input>
<el-input <el-input
v-else v-else
:maxlength="item.maxlength"
v-model="searchModel[item.name]" v-model="searchModel[item.name]"
clearable clearable
:placeholder="`请输入${item.label}`" :placeholder="`请输入${item.label}`"
@ -219,7 +222,7 @@
v-for="item in columns" v-for="item in columns"
:key="item.label" :key="item.label"
:filter-method="item.filters && filterHandler" :filter-method="item.filters && filterHandler"
show-overflow-tooltip :show-overflow-tooltip="!item.wrap"
v-bind="item" v-bind="item"
> >
<template #header="scope" v-if="!!item.labelSlot"> <template #header="scope" v-if="!!item.labelSlot">
@ -247,7 +250,7 @@
</div> </div>
</template> </template>
<script> <script>
import { defineComponent, reactive, toRefs, onBeforeMount } from 'vue' import { defineComponent, reactive, toRefs, onBeforeMount, watch } from 'vue'
const formatDate = (date, format) => { const formatDate = (date, format) => {
var obj = { var obj = {
'M+': date.getMonth() + 1, 'M+': date.getMonth() + 1,
@ -321,6 +324,11 @@ export default defineComponent({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
//
hideToolbar: {
type: Boolean,
default: false,
},
// false // false
search: { search: {
type: [Boolean, Object], type: [Boolean, Object],
@ -337,8 +345,8 @@ export default defineComponent({
}, },
// KeyelementUItablerow-key // KeyelementUItablerow-key
rowKey: { rowKey: {
type: String, type: [String, Function],
default: 'id', default: () => {},
}, },
// false // false
pagination: { pagination: {
@ -376,8 +384,8 @@ export default defineComponent({
state.loading = true state.loading = true
const searchModel = optimizeFields(props.search) const searchModel = optimizeFields(props.search)
const { data, total } = await props.request({ const { data, total } = await props.request({
pageNum: state.pageNum, current: state.pageNum,
pageSize: state.pageSize, size: state.pageSize,
...searchModel, ...searchModel,
}) })
state.loading = false state.loading = false
@ -385,10 +393,6 @@ export default defineComponent({
state.total = total state.total = total
} }
onBeforeMount(() => {
getTableData()
})
const state = reactive({ const state = reactive({
searchModel: getSearchModel(props.search), searchModel: getSearchModel(props.search),
loading: false, loading: false,
@ -470,6 +474,18 @@ export default defineComponent({
} }
} }
watch(
() => props.search,
val => {
state.searchModel = getSearchModel(val)
},
{ deep: true }
)
onBeforeMount(() => {
getTableData()
})
return { return {
...toRefs(state), ...toRefs(state),
} }
@ -492,10 +508,11 @@ export default defineComponent({
.search-btn { .search-btn {
margin-left: auto; margin-left: auto;
} }
::v-deep(.el-input-number .el-input__inner) { :deep(.el-input-number .el-input__inner) {
text-align: left; text-align: left;
} }
} }
.head { .head {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -509,10 +526,6 @@ export default defineComponent({
.table { .table {
padding: 20px; padding: 20px;
background: #fff; background: #fff;
::v-deep(th) {
background: #f6f6f6;
color: rgba(0, 0, 0, 0.85);
}
} }
.pagination { .pagination {
padding: 0 20px 20px; padding: 0 20px 20px;