前言
最近在做宝马的一个项目,需要实现 Table 的全选 & 取消全选,原型图如下:
原型图
然而,antd 官网给的例子里只有在组件中的实现方法(自定义选择项——通过 rowSelection.selections 配置),如下图:
antd 提供的功能
如果想要做到原型图这样在组件外实现全选 & 取消全选,则需要更灵活地运用 rowSelection 这个配置项。
Talk is cheap, show me the code!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| const [selectedRowKeys, setSelectedRowKeys] = useState([]); const [selectedRows, setSelectedRows] = useState([]); const [tableData, setTableData] = useState([]);
useEffect(() => { setTableData(mock); }, []);
const handleChange = (selectedRowKeys, selectedRows) => { setSelectedRowKeys([...selectedRowKeys]); setSelectedRows([...selectedRows]); };
const selectAll = () => { tableData.forEach((o, i) => { if (!selectedRows.includes(o)) selectedRowKeys.push(tableData[i].account); }); handleChange(selectedRowKeys, [...tableData]); };
const selectNone = () => { handleChange([], []); };
const rowSelection = { selectedRowKeys, type: "checkbox", onChange: handleChange };
<Table rowKey="account" columns={columns} dataSource={mock} rowSelection={rowSelection} />
|
总结
其实最关键的地方在于 rowSelection 里的 onChange ,通常的回调函数我们不会直接调用,而在这里,如果要实现在表格外全选,则需要手动调用这个 onChange 。
2023.1.21 更新
最近做了个需求,需要在一个 form 中做三个字段间的联动:
期间遇到了form.setFieldsValue 不会触发控件 onChange的问题,找到了一个解决方案,和我这篇文章的思路挺像的,也是需要手动触发一个回调函数,在这里更新记录一下。
留言
欢迎交流想法,也欢迎指出文中的问题。