vue组件封装——公用基础form组件

查询、新增、重置按钮自带,其他按钮通过插槽自定义
hasPage参数控制是否添加分页参数,查询功能自动将page改为1
重置功能默认恢复表单初始化
行内样式表单

<template>
  <!-- :label-width="labelwidth" -->
  <el-form
    :model="formData"
    :rules="rules"
    :size="size"
    ref="queryForm"
    :inline="inline"
    class="publi-form publi-flex"
  >
    <div v-for="column in columns" :key="column.prop">
      <el-form-item :label="column.label" :prop="column.prop" v-if="column.type == 'input'">
        <!-- 普通输入框 -->
        <el-input
          v-model="formData[column.prop]"
          :clearable="column.clearable || true"
          :disabled="column.disabled || false"
          :placeholder="column.placeholder"
        ></el-input>
      </el-form-item>
      <el-form-item :label="column.label" :prop="column.prop" v-if="column.type == 'select'">
        <el-select
          v-model="formData[column.prop]"
          :placeholder="column.placeholder"
          :clearable="column.clearable || true"
          :disabled="column.disabled || false"
          :filterable="column.filterable || false"
          :multiple="column.multiple || false"
        >
          <el-option
            v-for="(options, index) in column.options"
            :label="column.optionsDefault ? options[column.optionsDefault[0]] : options"
            :value="column.optionsDefault ? options[column.optionsDefault[1]] : options"
            :key="column.optionsDefault ? options[column.optionsDefault[1]] : index"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item :label="column.label" :prop="column.prop" v-if="column.type == 'cascader'">
        <el-cascader
          v-model="formData[column.prop]"
          :placeholder="column.placeholder"
          :clearable="column.clearable || true"
          :disabled="column.disabled || false"
          :options="column.options"
          @change="handleChange"
        ></el-cascader>
      </el-form-item>
      <el-form-item :label="column.label" :prop="column.prop" v-if="column.type == 'datetimerange'">
        <el-date-picker
          v-model="formData[column.prop]"
          :format="column.format || 'yyyy-MM-dd HH:mm:ss'"
          :value-format="column.valueFormat || 'yyyy-MM-dd HH:mm:ss'"
          :type="column.rangeType || 'datetimerange'"
          :range-separator="column.range || '至'"
          :unlink-panels="column.unlinkPanels || false"
          :start-placeholder="column.rangePlaceholder ? column.rangePlaceholder[0] : '开始时间'"
          :placeholder="column.placeholder"
          :end-placeholder="column.rangePlaceholder ? column.rangePlaceholder[1] : '结束时间'"
          :clearable="column.clearable || true"
          :disabled="column.disabled || false"
        ></el-date-picker>
      </el-form-item>
      <el-form-item
        :label="column.label"
        :prop="column.prop"
        v-if="column.type == 'slot' && column.show == true"
      >
        <slot :name="column.prop"></slot>
      </el-form-item>
    </div>
    <el-form-item class="func-btn">
      <!-- 查询按钮 -->
      <template v-if="queryPerm">
        <el-button
          type="primary"
          icon="el-icon-search"
          @click="queryByWord()"
          v-if="hasPerm(queryStr)"
          >查询</el-button
        >
      </template>
      <template v-else>
        <el-button type="primary" icon="el-icon-search" @click="queryByWord()">查询</el-button>
      </template>
      <!-- 新增按钮 -->
      <template v-if="addPerm && addBtn">
        <el-button type="success" icon="el-icon-plus" @click="add()" v-if="hasPerm(addStr)">{{
          addLabel
        }}</el-button>
      </template>
      <template v-else>
        <el-button type="success" icon="el-icon-plus" @click="add()" v-if="addBtn">{{
          addLabel
        }}</el-button>
      </template>
      <!-- 重置按钮 -->
      <el-button @click="onReset" v-if="resetBtn" icon="el-icon-refresh">重置</el-button>
      <!-- 其他功能按钮插槽 -->
      <slot name="btnSlot" :form="formData"></slot>
    </el-form-item>
  </el-form>
</template>
<script>
export default {
  props: {
    columns: {
      //表单配置项
      type: Array,
      default: () => [],
    },
    rules: {
      //验证规则
      type: Object,
      default: () => {
        return {};
      },
    },
    size: {
      //表单内组件尺寸
      type: String,
      default: 'mini',
    },
    resetBtn: {
      //显示重置按钮
      type: Boolean,
      default: false,
    },
    addBtn: {
      //显示新增按钮
      type: Boolean,
      default: false,
    },
    labelwidth: {
      //label宽度
      type: String,
      default: '120px',
    },
    inline: {
      //是否为行内式表单
      type: Boolean,
      default: true,
    },
    hasPage: {
      //是否包含分页参数
      type: Boolean,
      default: true,
    },
    addLabel: {
      type: String,
      default: '新增',
    },
    queryPerm: {
      //查询是否存在权限限制
      type: Boolean,
      default: false,
    },
    queryStr: {
      //查询权限字符
      type: String,
      default: '',
    },
    addPerm: {
      //新增是否存在权限限制
      type: Boolean,
      default: false,
    },
    addStr: {
      //新增权限字符
      type: String,
      default: '',
    },
  },
  data() {
    return {
      formData: {},
    };
  },
  methods: {
    handleChange(value) {
      console.log(value, 454545);
    },
    // 查询
    queryByWord() {
      this.$refs['queryForm'].validate((valid)