前端table表格的全选/反选/跨页勾选(封装)

前提:项目需要,想要一个可以全选,反选,跨页勾选的需求。

如图:

前置条件1:table表格里面必须有一项是作为这一条数据的唯一值,比如:id,必须要有的!!我的案例是pathologyId,因为我们项目需要这个东西作为参数传给其他按钮。

前置条件2:点击全选按钮,需要调接口,让后端给你返全部需要勾选的数据:pathologyId,例如【1,2,3】这样我们才知道全选选哪些数据

前置条件3:点击反选按钮,需要调接口,让后端给你返全部需要勾选的数据:pathologyId,例如【1,2,3】这样我们才知道反选选哪些数据

以上准备好就可以了。

utils里面创建一个table.js,内容如下

/**
 * 全选操作时-全选当前页
 * @param {object} tableRef 表格ref对象
 * @param {Array<any>} currentPageData 当前页数据
 */
export const selectAllCurrentPage = (tableRef, currentPageData) => {
  if (tableRef) {
    currentPageData.forEach((row) => {
      tableRef.toggleRowSelection(row, true)
    })
  }
}

/**
 * 手动选中/取消选中
 * @param {Array} selection 当前页选中列表
 * @param {Array} selectIds 跨页选中的id列表
 * @param {Array} currentPageData 当前页数据
 * @param {string} key 每条数据的key
 * @returns {Array<any>} _selectIds
 */
export const selectionChange = (selection, selectIds, currentPageData, key = 'id') => {
  let _selectIds = [...selectIds]
  const currentPageSelectIds = (selection || []).map((it) => it[key])
  _selectIds = [..._selectIds, ...currentPageSelectIds]

  currentPageData &&
    currentPageData.forEach((it) => {
      if (!currentPageSelectIds.includes(it[key])) {
        _selectIds = _selectIds.filter((_id) => _id !== it[key])
      }
    })
  _selectIds = [...new Set([..._selectIds])] // 去重
  return _selectIds
}

/**
 * 切换页码时,显示当前页已选中的,即已在selectIds中的,不在selectIds中的则取消选中
 * @param {object} tableRef 表格ref对象
 * @param {Array} currentPageData 当前页数据
 * @param {Array} selectIds 跨页选中的id列表
 * @param {string} key 每条数据的key
 */
export const selectCurrentOnChangePage = (tableRef, currentPageData, selectIds, key = 'id') => {
  if (tableRef) {
    currentPageData.forEach((row) => {
      if (selectIds.includes(row[key])) {
        tableRef.toggleRowSelection(row, true)
      } else {
        tableRef.toggleRowSelection(row, false)
      }
    })
  }
}

页面使用时:

先引用:

import { selectAllCurrentPage, selectionChange, selectCurrentOnChangePage } from '@/utils/table'

先定义selectListIds :【】,为了知道哪些数据是要选中的。

selectAllCurrentPage这个是全选方法。selectCurrentOnChangePage反选的方法

        selectAll() {
            defaultParams 是我们项目需求的参数,然后调接口那全选返回的ids
      const defaultParams = this.getRequestListParams()
      selectPathologyAll(defaultParams).then((res) => {
        this.selectListIds = res.data || []
        selectAllCurrentPage(this.$refs.table, this.tableData)
      })
    },
   * 反选
     */
    unSelect() {
      const defaultParams = this.getRequestListParams()
      selectPathologyReverse(defaultParams, this.selectListIds).then((res) => {
        this.selectListIds = res.data || []
        selectCurrentOnChangePage(this.$refs.table, this.tableData, this.selectListIds, 'pathologyId')
      })
    },

表格里面记得使用第二个引入的方法selectionChange:

  <el-table
        ref="table"
        class="list-table"
        :data="tableData"
        style="width: 100%"
        height="100%"
        stripe
        @select-all="selectionChange"
        @select="selectionChange"
        @sort-change="sortChange"
      >

methods里面:
     * 表格勾选
     * @param {Array} selection
     */
    selectionChange(selection) {
      this.selectListIds = selectionChange(selection, this.selectListIds, this.tableData, 'pathologyId')
    },

切分页/页码数时候

    handleSizeChange(val) {
      this.params.pageSize = val
      this.params.pageNum = 1
      this.getList().then(() => {
        selectCurrentOnChangePage(this.$refs.table, this.tableData, this.selectListIds, 'pathologyId')
      })
    },
    handleCurrentChange(val) {
      this.params.pageNum = val
      this.getList().then(() => {
        selectCurrentOnChangePage(this.$refs.table, this.tableData, this.selectListIds, 'pathologyId')
      })
    },

以上就结束了。亲测好用极了

非常简单

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ant Design的表格组件提供了一个Checkbox组件用于全选控制,可以通过以下步骤实现: 1. 在columns数组中添加一个Checkbox列,设置render函数返回Checkbox组件。 ```javascript const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, { title: '', key: 'checkbox', render: (text, record) => <Checkbox onChange={() => handleCheckboxChange(record)} /> }, ]; ``` 2. 在Table组件外部添加一个Checkbox组件,设置onChange函数控制表格全选/反选。 ```javascript const [selectedRowKeys, setSelectedRowKeys] = useState([]); const handleCheckboxChange = (record) => { const rowKey = record.key; const selectedRowKeysCopy = [...selectedRowKeys]; const index = selectedRowKeysCopy.indexOf(rowKey); if (index >= 0) { selectedRowKeysCopy.splice(index, 1); } else { selectedRowKeysCopy.push(rowKey); } setSelectedRowKeys(selectedRowKeysCopy); }; const handleCheckAllChange = (e) => { if (e.target.checked) { const keys = data.map((record) => record.key); setSelectedRowKeys(keys); } else { setSelectedRowKeys([]); } }; <Checkbox onChange={handleCheckAllChange}>Select All</Checkbox> <Table columns={columns} dataSource={data} rowSelection={{ selectedRowKeys, onChange: setSelectedRowKeys, }} /> ``` 这样就可以在表格外部添加一个全选的Checkbox,控制表格全选/反选功能了。同时也需要注意,在Table组件中添加rowSelection属性,用于控制选中的行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值