vue+ElementUI el-select实现下拉选择表格组件(2023-09-04 TSelectTable组件实现虚拟滚动,解决不分页数据量大渲染DOM过多而卡顿问题)

2023-09-04 TSelectTable组件实现虚拟滚动,解决不分页数据量大渲染DOM过多而卡顿问题

在这里插入图片描述

2023-08-21 解决TSelectTable组件表单编辑回显设置defaultSelectVal 无效

一、最终效果

在这里插入图片描述

二、代码示例

<t-select-table
    :table="table"
    :columns="table.columns"
    :max-height="400"
    :keywords="{label:'name',value:'id'}"
    @radioChange="radioChange"
  ></t-select-table>

三、参数配置

1. 配置参数(Attributes)

参数说明类型默认值
v-model绑定值boolean / string / number仅显示
table表格数据对象Object{}
—data展示下拉数据源Array[]
—total数据总条数Number-
—pageSize每页显示条目个数Number-
—currentPage当前页数Number-
columns表头信息Array[]
----bindel-table-column AttributesObject-
----noShowTip是否换行 (设置:noShowTip:true)Booleanfalse
----fixed列是否固定( left, right)string, boolean-
----align对齐方式(left/center/right)Stringcenter
----render返回三个参数(text:当前值,row:当前整条数据 ,index:当前行)function-
----slotName插槽显示此列数据(其值是具名作用域插槽)String-
------scope具名插槽获取此行数据必须用解构接收{scope}Object当前行数据
keywords关键字配置(value-key 配置)Object
------label选项的标签String‘label’
------value选项的值String‘value’
radioTxt单选文案String单选
multiple是否开启多选Booleanfalse
isShowFirstColumn是否显示首列(单选)booleantrue
filterable是否开启过滤(根据 keywords 的 label 值进行过滤)Booleantrue
reserveSelection是否支持翻页选中Booleantrue
isShowPagination开启分页Booleanfalse
defaultSelectVal设置默认选中项–keywords.value 值(单选是 String, Number 类型;多选时是数组)Number / string / Array-
tableWidthtable 宽度Number550
isShowQuery是否允许配置查询条件(继承TQueryCondition的所有属性、事件、插槽)Booleanfalse

2. 事件(events)

事件名说明回调参数
page-change页码改变事件返回选中的页码
selectionChange多选事件返回选中的项数据及选中项的 keywords.value 集合
radioChange单选返回当前项所有数据

3.方法(Methods)

方法名说明回调参数
focus使 input 获取焦点
blur使 input 失去焦点,并隐藏下拉框

四、部分源码gitHub组件地址

<template>
  <el-select
    ref="select"
    v-model="defaultValue"
    popper-class="t-select-table"
    :multiple="multiple"
    v-bind="selectAttr"
    v-on="$listeners"
    :value-key="keywords.value"
    @visible-change="visibleChange"
    @remove-tag="removeTag"
    @clear="clear"
  >
    <template #empty>
      <div class="t-table-select__table" :style="{ width: `${tableWidth}px` }">
        <el-table
          ref="el-table"
          :data="tableData"
          class="radioStyle"
          border
          @row-click="rowClick"
          @cell-dblclick="cellDblclick"
          @selection-change="selectionChange"
          v-bind="$attrs"
          v-on="$listeners"
        >
          <el-table-column v-if="multiple" type="selection" width="45" fixed></el-table-column>
          <el-table-column type="radio" width="50" :label="radioTxt" fixed v-else>
            <template slot-scope="scope">
              <el-radio
                v-model="radioVal"
                :label="scope.$index+1"
                @click.native.prevent="radioChange(scope.row,scope.$index+1)"
              ></el-radio>
            </template>
          </el-table-column>
          <template v-for="(item,index) in columns">
            <el-table-column
              :key="index+'i'"
              :type="item.type"
              :label="item.label"
              :prop="item.prop"
              :min-width="item['min-width'] || item.minWidth || item.width"
              :align="item.align || 'center'"
              :fixed="item.fixed"
              :show-overflow-tooltip="item.noShowTip"
              v-bind="{...item.bind,...$attrs}"
              v-on="$listeners"
            >
              <template slot-scope="scope">
                <!-- render方式 -->
                <template v-if="item.render">
                  <render-col
                    :column="item"
                    :row="scope.row"
                    :render="item.render"
                    :index="scope.$index"
                  />
                </template>
                <!-- 作用域插槽 -->
                <template v-if="item.slotName">
                  <slot :name="item.slotName" :scope="scope"></slot>
                </template>
                <div v-if="!item.render&&!item.slotName">
                  <span>{{scope.row[item.prop]}}</span>
                </div>
              </template>
            </el-table-column>
          </template>
          <slot></slot>
        </el-table>
        <div class="t-table-select__page">
          <el-pagination
            v-show="(tableData && tableData.length) && isShowPagination"
            :current-page="table.currentPage"
            @current-change="handlesCurrentChange"
            :page-sizes="[10, 20, 50, 100]"
            :pager-count="5"
            :page-size="table.pageSize"
            layout="total,  prev, pager, next, jumper"
            :total="table.total"
            v-bind="$attrs"
            v-on="$listeners"
            background
          ></el-pagination>
        </div>
      </div>
    </template>
  </el-select>
</template>

五、组件地址

gitHub组件地址

gitee码云组件地址

六、相关文章

基于ElementUi再次封装基础组件文档


vue+element-ui的table组件二次封装

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wocwin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值