h-table(表格列表组件的全封装)

该博客介绍了使用Vue进行组件封装的方法,包括h-table的封装过程,由高级查询、table表格、tool工具设置栏三大组件合成。还涉及查询组件h-highForm、右侧工具栏RightToolbar的封装,以及列表组件h-table,最后提及了vue页面使用和js文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

如何使用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@逆风boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值