文章目录
概要
如何使用vue封装列表高级查看,表格多种配置使用
h-table的封装过程
(1)高级查询
(2)table表格
(3)tool工具设置栏
三大组件共同合成封装表格组件
查询组件封装 h-highForm
<template>
<div class="high-form">
<!-- 左侧筛选查询 -->
<el-input
placeholder="请输入内容"
v-model="inputValue"
@keydown.enter.native="search"
class="input-with-select"
>
<el-select
class="el-select"
v-model="selectValue"
slot="prepend"
:placeholder="
selectList && selectList.length > 0 ? selectList[0].label : '暂无数据'
"
>
<el-option
v-for="v in selectList"
:key="v.value"
:label="v.label"
:value="v.value"
>
</el-option>
</el-select>
<!-- 清除按钮 -->
<i
slot="suffix"
v-if="inputValue"
@click="leftClear"
class="el-input__icon el-icon-circle-close"
></i>
</el-input>
<!-- 外面的查询按钮 -->
<el-button type="primary" @click="search" class="query-button-custom">
查询
</el-button>
<!-- 右侧高级查询表单 -->
<zy-dropdown
trigger="click"
placement="bottom"
ref="dropDown"
width="500"
v-show="showSearch"
v-if="highForm.length > 0"
:hide-on-click="false"
@visible-change="visibleChange"
>
<el-button>
{
{
isShowDropdown
? "收起查询"
: count
? `高级查询(${
count})`
: "高级查询"
}}<i
:class="
isShowDropdown
? 'el-icon-arrow-up el-icon--right'
: 'el-icon-arrow-down el-icon--right'
"
></i>
</el-button>
<el-dropdown-menu slot="dropdown" :class="isTabItem ? 'nav-info' : ''">
<el-button type="text" class="query-title">高级查询</el-button>
<el-form
:model="model"
ref="ruleForm"
class="form-content"
label-width="120px"
>
<el-row
v-for="(items, index) in highForm"
:key="`highForm` + index"
class="el-row-box"
>
<el-col
:span="items.length <= 1 ? 24 : 12"
v-for="i in items"
:key="i.prop"
>
<el-form-item
v-if="i.definite != false"
:label="`${i.label}:`"
:prop="i.prop"
>
<el-select
v-if="i.type === 'select'"
style="width: 240px"
v-model="model[i.prop]"
:placeholder="
i.placeholder ? i.placeholder : `请选择${
i.label}`
"
:remote="i.remote ? i.remote : false"
:remote-method="i.remoteMethod"
:multiple="i.multiple ? i.multiple : false"
:collapse-tags="i.collapseTags ? i.collapseTags : true"
@blur="selectBlur($event, i)"
@focus="selectFocus($event, i)"
@change="selectChange($event, i)"
popper-class="popper-class"
:popper-append-to-body="true"
filterable
clearable
>
<el-option
v-for="(j, k) in i.optList"
:key="k"
:label="
j[
i.options && i.options.label ? i.options.label : 'label'
]
"
:value="
j[
i.options && i.options.value ? i.options.value : 'value'
]
"
>
<div class="el-select__text" v-overflow-tooltip>
{
{
j[
i.options && i.options.label
? i.options.label
: "label"
]
}}
</div>
</el-option>
</el-select>
<el-cascader
v-else-if="i.type === 'cascader'"
style="width: 240px"
v-model="model[i.prop]"
:props="i.options ? i.options : null"
:options="i.optList"
:collapse-tags="i.collapseTags ? i.collapseTags : true"
:filterable="i.filterable ? i.filterable : true"
:placeholder="
i.placeholder ? i.placeholder : `请选择${
i.label}`
"
@change="cascaderChange"
@expand-change="expandChange"
clearable
:append-to-body="true"
>
</el-cascader>
<el-date-picker
v-else-if="
i.type == 'year' ||
i.type == 'month' ||
i.type == 'date' ||
i.type == 'dates' ||
i.type == 'months' ||
i.type == 'years' ||
i.type == 'week' ||
i.type == 'datetime'
"
style="width: 240px"
v-model="model[i.prop]"
:type="i.type"
:placeholder="
i.placeholder ? i.placeholder : `请选择${
i.label}`
"
:pickerOptions="
i.pickerOptions ? i.pickerOptions : pickerOptions
"
:value-format="i.format"
:format="i.type == 'week' ? 'yyyy 第 WW 周' : ''"
@change="singleChange"
:append-to-body="true"
popper-class="date-picker-pop"
>
</el-date-picker>
<el-date-picker
v-else-if="
i.type == 'daterange' ||
i.type == 'monthrange' ||
i.type == 'datetimerange'
"
style="width: 240px"
v-model="model[i.prop]"
:type="i.type"
range-separator="至"
:start-placeholder="
i.startPlaceholder ? i.startPlaceholder : '开始时间'
"
:end-placeholder="
i.endPlaceholder ? i.endPlaceholder : '结束时间'
"
:pickerOptions="
i.pickerOptions ? i.pickerOptions : pickerOptions
"
:value-format="i.format"
:append-to-body="true"
popper-class="date-picker-pop"
>
</el-date-picker>
<el-time-picker
v-else-if="i.type === 'timePicker'"
:placeholder="
i.placeholder ? i.placeholder : `请选择${
i.label}`
"
v-model="model[i.prop]"
style="width: 100%"
popper-class="date-picker-pop"
></el-time-picker>
<el-switch
v-else-if="i.type == 'switch'"
v-model="model[i.prop]"
></el-switch>
<el-radio-group
v-else-if="i.type == 'radio'"
v-model="model[i.prop]"
>
<el-radio
v-for="(j, k) in i.optList"
:label="j"
:key="k"
></el-radio>
</el-radio-group>
<el-checkbox-group
v-else-if="i.type == 'checkbox'"
v-model="model[i.prop]"
>
<el-checkbox
v-for="ch in i.checkboxs"
:label="ch.value"
:key="ch.value"
>{
{
ch.label }}</el-checkbox
>
</el-checkbox-group>
<el-input
v-else
style="width: 240px"
:type="i.type"
clearable
v-model="model[i.prop]"
:maxlength="i.maxlength"
:placeholder="
i.placeholder ? i.placeholder : `请输入${
i.label}`
"
>
</el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<slot name="operate">
<div class="footer">
<el-button type="primary" size="mini" @click="search">
查询
</el-button>
<el-button size="mini" @click="reset">重置</el-button>
</div>
</slot>
</el-dropdown-menu>
</zy-dropdown>
</div>
</template>
<script>
import ZyDropdown from "./dropdown.vue";
export default {
name: "zy-high-form",
components: {
ZyDropdown },
props: {
isTabItem: {
type: Boolean,
default: false,
},
// 搜索配置
formConfig: {
type: Array,
default: () => [],
},
// 默认查询数据,如果没有默认数据,可不传
params: {
type: Object,
default: () => {
},
},
// 是否展示高级搜索
showSearch: {
type: Boolean,
default: () => true,
},
autoParams: Function,
},
data() {
return {
//高级查询展示/隐藏
isShowDropdown: false,
pickerOptions: {
disabledDate: (time) => {
const day = 365 * 24 * 3600 * 1000; // 31536000000
// 返回小于当前日期并近一年内的日期
return (
time.getTime() > Date.now() ||
time.getTime() < Date.now() - 8.64e7 - day
);
},
},
// 查询数据源
model: {
},
// 下拉框的值
selectValue: "firstKeyWord",
// 输入框的值
inputValue: "",
// 已选数量
count: 0,
};
},
created() {
// 在组件挂载后设置日期选择器的z-index样式
const datePickerPop = document.querySelector(
".date-picker-pop .el-picker-panel"
);
if (datePickerPop) {
datePickerPop.style.zIndex = 2000;
}
this.resetModel();
},
computed: {
//左侧下拉框
selectList() {
const list = [{
label: "全部", value: "firstKeyWord" }];
for (let i = 0; i < this.formConfig.length; i++) {
const item = this.formConfig[i];
if (item.nimble == true