index.vue 2.21 KB
<template>
  <z-form v-model="model" class="zee-filter" :list="formattedList" :span="span" :labelWidth="labelWidth" :colClass="colVisibleRender" :size="size">
    <div slot="$operation" class="zee-filter__button-group">
      <el-button-group :size="size">
        <el-button type="primary" @click="handleSearch"><span>查询</span></el-button>
        <el-button @click="handleReset"><span>重置</span></el-button>
        <el-button v-if="showCollapsed" @click="collapsed = !collapsed">
          <span>{{ collapsed ? '展开' : '收起' }}</span>
          <!-- <i :class="`el-icon-arrow-${collapsed ? 'down' : 'up'}`" class="el-icon--right"></i> -->
        </el-button>
      </el-button-group>
    </div>
  </z-form>
</template>

<script>
export default {
  name: 'Filter',
  props: {
    value: Object,
    list: Array,
    labelWidth: {
      type: String,
      default: '80px',
    },
    size: {
      type: String,
      default: 'small',
    },
    span: {
      type: Number,
      default: 6,
    },
    visibleNum: {
      type: Number,
      default: 3,
    },
  },
  data() {
    return {
      collapsed: true,
      model: this.value || {},
    };
  },
  watch: {
    value(val = {}) {
      this.model = val;
    },
    model(val) {
      this.$emit('input', val);
    },
  },
  computed: {
    formattedList() {
      return [...this.list, { key: '$operation', label: '', labelWidth: '0px', span: !this.collapsed ? 24 : undefined }];
    },
    showCollapsed() {
      const { list, visibleNum } = this;
      return list.length > visibleNum;
    },
  },
  methods: {
    // 渲染列表项class
    colVisibleRender(item, index) {
      if (this.collapsed) {
        const visibleNumber = this.visibleNum ? this.visibleNum - 1 : 2;
        return index > visibleNumber && index < this.list.length ? 'zee-filter__item hidden' : 'zee-filter__item';
      }
      return 'zee-filter__item';
    },
    // 搜索
    handleSearch() {
      this.$emit('search', this.model);
    },
    // 重置
    handleReset() {
      this.model = {};
      this.$emit('reset');
    },
  },
};
</script>

<style>
.zee-filter__item.hidden {
  display: none;
}
.zee-filter__button-group {
  width: 100%;
  box-sizing: border-box;
  text-align: right;
}
</style>