如何将页面行数传入React Table v7列定义实现全选半选状态
React Table v7 分页表格实现表头全选复选框不确定状态
当然可以把当前页面的行数传入列定义里,核心思路是利用React Table的usePagination钩子拿到当前页的行数据,再通过它的长度来判断复选框的不确定状态。
具体实现步骤:
获取当前页数据
在使用useTable时集成usePagination钩子,从返回值里拿到page——这个数组就是当前分页下的所有行数据,它的长度就是当前页面的总行数:const { getTableProps, getTableBodyProps, headerGroups, page, // 当前页的行数据集合 // 其他所需的钩子返回值 } = useTable( { columns, data }, usePagination );在列定义中使用当前页行数
直接在表头复选框的Header组件里引用page.length即可,不用额外传递,只要page和列定义在同一个作用域下:const columns = [ { id: 'select', Header: () => ( <Checkbox color="default" onClick={(e) => handleAllCheckbox(e, page)} checked={checked.allLanes} indeterminate={ checked.selectedLane.length > 0 && checked.selectedLane.length !== page.length } /> ), // 其他列配置(如Cell渲染行复选框) }, // 其他列 ];
关键细节注意:
- 确保
checked.selectedLane存储的是当前页选中行的ID/标识,而非全局所有选中行,否则判断逻辑会出错。 handleAllCheckbox函数里要基于page数组来批量选中或取消当前页的所有行,比如:const handleAllCheckbox = (e, currentPageRows) => { if (e.target.checked) { // 选中当前页所有行 const newSelected = currentPageRows.map(row => row.id); setChecked(prev => ({ ...prev, selectedLane: newSelected, allLanes: true })); } else { // 取消当前页所有行选中 setChecked(prev => ({ ...prev, selectedLane: [], allLanes: false })); } };
内容的提问来源于stack exchange,提问作者GNG
相关产品推荐
相关产品推荐

