vue2+Element表格实现跨页多选功能

一:场景

在dialog弹窗内对表格内容进行多选,且跨页选中项合并存储,支持已选中数据回显在表格

 

二:实现跨页多选过程

element组件已经给出了对应的属性设置,使用row-key + reserve-selection 两个属性即可完成跨页多选:

<Dialog ref="shopTable"> // 弹窗组件
<div slot="dialogMain"> // 弹窗组件插槽
    <el-table
        ref="tableRef"
        :data="tableList"
        border
        :row-key="getRowKeys"
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" :reserve-selection="true" />
        <el-table-column label="商城id" prop="activityId" />
        <el-table-column label="渠道id" prop="appId" />
        <el-table-column label="开始时间" prop="startTime" />
        <el-table-column label="状态">
          <template slot-scope="{ row }">
            {{ statusMap[row.status] }}
          </template>
        </el-table-column>
      </el-table>
      <el-pagination
        background
        layout="prev, pager, next"
        :total="1000"
        @current-change="handleCurrentChange"
      />
  </div>
  </Dialog>
  <script>
  const defaultData = {
      pageNo: 1,
      pageSize: 10
  }
  export default {
      name: 'DemoSelect',
      data() {
        return {
          statusMap: ['待开始', '进行中', '已结束', '已注销'],
          formData: {},
          tableList: [], // 数据列表
          total: 0, // 数据总量
          checkData: [ // 这是模拟曾经选中的数据,以测试回显
            { activityId: 1611239899, name: '嘿嘿嘿额1111' },
            { activityId: 1611239891, name: '嘿嘿嘿额2222' },
            { activityId: 1611239846, name: '嘿嘿嘿额3333' }
          ]
        }
  },
  methods: {
    // 多选变动
    handleSelectionChange(val) {
      console.log(val, '选中数据')
    },
    // 获取每行唯一标识
    getRowKeys(row) {
      return row.activityId
    },
    // 切换分页
    handleCurrentChange(val) {
      this.formData.pageNo = val
      this.fetchData() // 列表数据
    }
  }
  </script>

1:多选框

type="selection"

对应列的类型。如果设置了 selection 则显示多选框;如果设置了index则显示该行的索引(从1 开始计算)

2: 行数据key

:row-key="getRowKeys"

行数据的 Key。用来优化 Table 的渲染;在使用 reserve-selection 功能与显示树形数据时,该属性是必填的。注意此处很重要,用你每行数据的唯一值,此处我用的activityId,一般数据的唯一值应该是id

3: 跨页多选

:reserve-selection="true"

仅对 type=selection 的列有效,类型为 Boolean,为 true则会在数据更新之后保留之前选中的数据(需指定 row-key)

三:数据回显

show() {
  this.formData = Object.assign({}, defaultData)
  this.fetchData() // 列表数据
  this.$refs.shopTable.show()
  // 注意:这里必须在弹窗组件已显示后,再使用nextTick来使用toggleRowSelection
  this.$nextTick(() => {
    this.checkData.forEach((row) => {
      //toggleRowSelection用来设置某行的选中状态,必须保证表格dom已经彻底加载完毕才能使用
      this.$refs.tableRef.toggleRowSelection(row)
    })
  })
},

四,常见错误

[Vue warn]: Error in mounted hook: "TypeError: Cannot read properties of undefined (reading 'toggleRowSelection')"

错误原因就是未能保证表格dom彻底加载后再使用toggleRowSelection方法,当然这种一般只在弹窗内表格这种场景才会出现,上述《三:数据回显》已经处理了这种问题

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值