这种带有分页的全选 如果我们翻页也需要记录跨页的勾选数据 antd自带的onChange事件只能记录选中RowKey值 但是勾选的数据只会是当前页的条数 此时就需要我们结合onSelect和onSelectAll来完成数据的交互
<Table
loading={tableDataloading}
rowKey="id"
rowSelection={rowSelection}
pagination={pagination}
dataSource={data}
columns={columns}
scroll={{ x: data.length ? 1080 : 0 }}
onRow={(record) => ({})}
/>
const rowSelection = {
selectedRowKeys,
onChange: this.onRowSelectionChange,
onSelect: this.onSelect,
onSelectAll: this.onSelectAll,
getCheckboxProps: (record) => ({
disabled: record.canApply === 0, // Column configuration not to be checked
}),
}
onRowSelectionChange = (selectedRowKeys, selectedRows) => {
this.setState({
selectedRowKeys,
// checkedRowsArray: selectedRows,
})
}
/**
* 用户手动选择/取消选择所有行的回调
* @param selected false:反选,true:选择
* @param selectedRows
* @param changeRows
*/
onSelectAll = (selected, selectedRows, changeRows) => {
let { allSelectedRows } = this.state
// 加入新选择的所有行
if (selected && changeRows.length > 0) {
changeRows.forEach((item) => {
allSelectedRows.push(item)
})
}
// 取消新选择的所有行
if (!selected && changeRows.length > 0) {
const a = new Set(changeRows)
const b = new Set(allSelectedRows)
allSelectedRows = [...b].filter((x) =>
[...a].every((y) => y.id !== x.id)
)
}
this.setState({ allSelectedRows })
}
/**
* 用户手动选择/取消选择某行的回调
* @param record
*/
onSelect = (record) => {
const { allSelectedRows } = this.state
let flag = true
for (let i = 0; i < allSelectedRows.length; i++) {
// 1. 如果选择的行在已选择行集合中就删除该记录,表示取消选中行
if (record.id === allSelectedRows[i].id) {
allSelectedRows.splice(i, 1)
flag = false
}
}
// 2. 如果第一步查询没有在已选集合中,就新增
if (flag) {
allSelectedRows.push(record)
}
this.setState({ allSelectedRows })
}
// 存储所有页面选择的数据,比如第一页两个,第二页两个,都存到这个数组中
allSelectedRows: [],
allSelectedRows就是所有页你勾选的数据的数组