两种解决方法
1.重写onchange函数,大致思路就是每次操作勾选、不选动作的时候,都移除当前列表的所有id,再把当前页重新选中的id,赋值到selectedRowKeys这个state里面。下面贴出核心代码
import * as _ from 'lodash';
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [selectedRows, setSelectedRows] = useState([]);
<ProTable
columns={getColumns()}
dataSource={data && data.list instanceof Array ? data.list : []}
rowSelection={{
selectedRowKeys,
onChange: (selectedRowKey, selectedRow) => {
//保存id
const currentIds = data.list.map(it => it.id);
const a = _.cloneDeep(selectedRowKeys);
_.pullAll(a, currentIds);
setSelectedRowKeys(a.concat(selectedRowKey));
//保存数据
let b = _.cloneDeep(selectedRows);
_.pullAllBy(b, data.list, 'id'); //删除当前列表所有的对象
const obj = {}; //数组对象根据id去重
b = b.concat(selectedRow).reduce((item, next) => {
obj[next.id] ? '' : (obj[next.id] = true && item.push(next));
return item;
}, []);
setSelectedRows(b);
},
}}
rowKey={record => record.id}
/>
2.重写onSelect函数和onSelectAll函数,定义两个全局变量,当选中单条,存入全局变量中,取消勾选时删除,当全选的时候,拼接出去重后的key数组,和row数组,取消的时候剔除掉即可
import * as _ from 'lodash';
let keys = [];
let rows = [];
const [selectedRowKeys, setSelectedRowKeys] = useState([]);
const [selectedRows, setSelectedRows] = useState([]);
<ProTable
columns={getColumns()}
dataSource={data && data.list instanceof Array ? data.list : []}
rowSelection={{
selectedRowKeys,
onSelect: (record, selected) => {
if (selected) {
keys.push(record.id);
rows.push(record);
} else {
_.pull(keys, record.id);
_.pullAllBy(rows, [record], 'id');
}
setSelectedRowKeys([...keys]);
setSelectedRows([...rows]);
},
onSelectAll: (selected, selectedRows, changeRows) => {
console.log(changeRows, 'changeRows');
const _keys = changeRows.map(item => item.id);
if (selected) {
keys = _.uniq([...keys, ..._keys]);
rows = _.uniqBy([...rows, ...changeRows], 'id');
} else {
_.pullAll(keys, _keys);
_.pullAllBy(rows, changeRows, 'id');
}
setSelectedRowKeys([...keys]);
setSelectedRows([...rows]);
},
}}
rowKey={record => record.id}