schangxiang@126.com
2024-11-21 60735779c303c2dd10feea45d7fd761103b225e0
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
<template>
    <div class="table-search-container" v-if="props.search.length > 0">
        <el-form ref="tableSearchRef" :model="searchModel" label-width="100px" class="table-form">
            <el-row :gutter="20">
                <!-- <el-col :xs="12" :sm="8" :md="8" :lg="6" :xl="4" class="mb20"></el-col> -->
                <el-col :xs="12" :sm="5" :md="5" :lg="6" :xl="4" class="mb20" v-for="(val, key) in search" :key="key" v-show="key < 3 || state.isToggle">
                    <template v-if="val.type !== ''">
                        <el-form-item
                            label-width="auto"
                            :label="val.label"
                            :prop="val.prop"
                            :rules="[{ required: val.required, message: `${val.label}不能为空`, trigger: val.type === 'input' ? 'blur' : 'change' }]"
                        >
                            <el-input
                                v-model="searchModel[val.prop]"
                                v-bind="val.comProps"
                                :placeholder="val.placeholder"
                                :clearable="!val.required"
                                v-if="val.type === 'input'"
                                @keyup.enter="onSearch(tableSearchRef)"
                                @change="val.change"
                                class="w100"
                            />
                            <el-date-picker
                                v-model="searchModel[val.prop]"
                                v-bind="val.comProps"
                                type="date"
                                :placeholder="val.placeholder"
                                :clearable="!val.required"
                                v-else-if="val.type === 'date'"
                                @change="val.change"
                                class="w100"
                            />
                            <el-date-picker
                                v-model="searchModel[val.prop]"
                                v-bind="val.comProps"
                                type="monthrange"
                                value-format="YYYY/MM/DD"
                                :placeholder="val.placeholder"
                                :clearable="!val.required"
                                v-else-if="val.type === 'monthrange'"
                                @change="val.change"
                                class="w100"
                            />
                            <el-date-picker
                                v-model="searchModel[val.prop]"
                                v-bind="val.comProps"
                                type="daterange"
                                value-format="YYYY/MM/DD"
                                :placeholder="val.placeholder"
                                :clearable="!val.required"
                                v-else-if="val.type === 'daterange'"
                                @change="val.change"
                                class="w100"
                            />
                            <el-select
                                v-model="searchModel[val.prop]"
                                v-bind="val.comProps"
                                :clearable="!val.required"
                                :placeholder="val.placeholder"
                                v-else-if="val.type === 'select'"
                                @change="val.change"
                                class="w100"
                            >
                                <el-option v-for="item in val.options" :key="item.value" :label="item.label" :value="item.value"> </el-option>
                            </el-select>
                            <el-cascader
                                v-else-if="val.type === 'cascader' && val.cascaderData"
                                :options="val.cascaderData"
                                :clearable="!val.required"
                                filterable
                                :props="val.cascaderProps ? val.cascaderProps : state.cascaderProps"
                                :placeholder="val.placeholder"
                                @change="val.change"
                                class="w100"
                                v-bind="val.comProps"
                                v-model="searchModel[val.prop]"
                            >
                            </el-cascader>
                        </el-form-item>
                    </template>
                </el-col>
                <el-col :xs="12" :sm="9" :md="9" :lg="6" :xl="4" class="mb20">
                    <el-form-item class="table-form-btn" label-width="auto">
                        <template #label>
                            <div v-if="search.length > 3">
                                <div class="table-form-btn-toggle" @click="state.isToggle = !state.isToggle">
                                    <span>{{ state.isToggle ? '收起' : '展开' }}</span>
                                    <SvgIcon :name="state.isToggle ? 'ele-ArrowUp' : 'ele-ArrowDown'" />
                                </div>
                            </div>
                        </template>
                        <div>
                            <!-- 使用el-button-group会导致具有type属性的按钮的右边框无法显示 -->
                            <!-- <el-button-group> -->
                            <el-button plain type="primary" icon="ele-Search" @click="onSearch(tableSearchRef)"> 查询 </el-button>
                            <el-button icon="ele-Refresh" @click="onReset(tableSearchRef)" style="margin-left: 12px"> 重置 </el-button>
                            <!-- </el-button-group> -->
                        </div>
                    </el-form-item>
                </el-col>
            </el-row>
        </el-form>
    </div>
</template>
 
<script setup lang="ts" name="makeTableDemoSearch">
import { reactive, ref, toRefs } from 'vue';
import type { FormInstance } from 'element-plus';
import { saulVModel } from '/@/utils/saulVModel';
 
// 定义父组件传过来的值
const props = defineProps({
    // 搜索表单,type-控件类型(input,select,cascader,date),options-type为selct时需传值,cascaderData,cascaderProps-type为cascader时需传值,属性同elementUI,cascaderProps不传则使用state默认。
    // 可带入comProps属性,和使用的控件属性对应
    search: {
        type: Array<TableSearchType>,
        default: () => [],
    },
    reset: {
        type: Object,
        default: () => ({}),
    },
    modelValue: {
        type: Object,
        default: () => ({}),
    },
});
 
// 定义子组件向父组件传值/事件
const emit = defineEmits(['search', 'reset', 'update:modelValue']);
 
// 将 props中的值转为 ref
const refProps = toRefs(props);
const searchModel = refProps.modelValue;
 
// 定义变量内容
const tableSearchRef = ref<FormInstance>();
const state = reactive({
    isToggle: false,
    cascaderProps: { checkStrictly: true, emitPath: false, value: 'id', label: 'name', expandTrigger: 'hover' },
});
 
const model = saulVModel(props, 'modelValue', emit).value;
 
// 查询
const onSearch = (formEl: FormInstance | undefined) => {
    if (!formEl) return;
    formEl.validate((valid: boolean) => {
        if (valid) {
            emit('search', model);
        } else {
            return false;
        }
    });
};
 
// 重置
const onReset = (formEl: FormInstance | undefined) => {
    if (!formEl) return;
    formEl.resetFields();
    emit('reset', model);
};
</script>
 
<style scoped lang="scss">
.table-search-container {
    display: flex;
 
    .table-form {
        flex: 1;
 
        .table-form-btn-toggle {
            white-space: nowrap;
            user-select: none;
            display: flex;
            align-items: center;
            color: var(--el-color-primary);
        }
    }
}
</style>