vue2公共组件封装baseQueryForm和BaseQueryFormItem

62 阅读1分钟
  • 组件包括两个部分baseQueryForm和BaseQueryFormItem
  • baseQueryForm代码
<template>
  <div>
    <div class="query-form">
      <el-form :inline="true" :model="value" ref="queryForm">
        <template v-for="(item, index) in form">
          <base-query-form-item :item="item"  v-bind="item" v-model="value[item.model]" :key="index"/>
        </template>
        <el-form-item>
          <el-button @click="handleReset" size="small">重置</el-button>
          <el-button type="primary" @click="handleQuery" size="small">查询</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import BaseQueryFormItem from "@/components/BaseQueryForm/BaseQueryFormItem.vue";

export default {
  name: 'QueryForm',
  props: ["value", "form"],
  components: {BaseQueryFormItem},
  data() {
    return {
      queryModel: {...this.value}
    }
  },
  methods: {
    handleReset() {
      this.$refs.queryForm.resetFields()
      this.$emit('update:handleReset')
    },
    handleQuery() {
      this.$emit("update:handleQuery", {...this.queryModel})
    }
  }
}
</script>

<style scoped>
/* 样式 */
</style>
  • BaseQueryFormItem的代码,这里可以具体根据业务场景进行类型扩展
<template>
  <el-form-item :prop="item.model" :label="item.label">
    <el-input v-if="item.type === 'input'" v-bind="$attrs" v-on="$listeners" :value="value"></el-input>
    <el-select v-else-if="item.type === 'select'" v-bind="$attrs" v-on="$listeners" :value="value" placeholder="请选择">
      <el-option v-for="option in item.options" :key="option.value" :label="option.label" :value="option.value"></el-option>
    </el-select>
  </el-form-item>
</template>

<script>
export default {
  name: 'BaseQueryFormItem',
  props: ["item", "value"],
  data() {
    return {
    }
  },
  computed: {
    selectedOption: {
      get() {
        return this.value
      },
      set(value) {
        this.$emit('update:value', value)
      }
    }
  },
  methods: {
    handleInput(value) {
      this.value = value
      this.$emit('update:value', this.value)
    }
  }
}
</script>

<style scoped>
/* 样式 */
</style>
  • 使用案例
<template>
  <div>
    <base-query-form
      :form="form" v-model="queryForm"
      @update:handleQuery="handleQuery"
      @update:handleReset="handleReset"
    ></base-query-form>
  </div>
</template>

<script>
import BaseQueryForm from "@/components/BaseQueryForm/BaseQueryForm.vue";

export default {
  name: 'bookKeepingTopSearchForm',
  components: {BaseQueryForm},
  props: ['queryForm'],
  data() {
    return {
      form: [
        {
          clearable: true,
          type: 'input',
          label: '集团号:',
          model: 'csrGroupNo',
          placeholder: '请输入',
        },
        {
          clearable: true,
          type: 'input',
          label: '会员号:',
          model: 'pnNo',
          placeholder: '请输入',
        },
        {
          clearable: true,
          type: 'select',
          label: '资产状态',
          model: 'isDeleted',
          placeholder: '请选择',
          options: [
            {
              value: 0,
              label: '已生效',
            },
            {
              value: 1,
              label: '已失效',
            },
          ]
        },
        {
          clearable: true,
          type: 'input',
          label: '记账单号:',
          model: 'id',
          placeholder: '请输入',
        }
      ],
    };
  },
  methods: {
    handleQuery(values) {
      this.$emit('searchTableData');
    },
    onSubmit() {
      this.$emit('searchTableData');
    },
    handleReset(form) {
      this.$emit('searchTableData');
    }
  },
};
</script>

<style scoped lang="scss">

</style>