packages/next/src/select-table/useCheckSlackly.tsx (69 lines of code) (raw):

import { getTreeKeys, hasSelectedKey, completedKeys, getCompatibleAllSelected, } from './utils' /** * 判断该字段的 indeterminate 属性 * @param record 当前字段 * @param flatDataSource 完整平铺数据 * @param selected 已选中的字段值集合 * @param primaryKey 键名称 * @returns indeterminate 属性值 */ const getIndeterminate = ( record: any, flatDataSource: any, selected: any[], primaryKey: string ) => { if (selected?.includes(record[primaryKey])) { return undefined } const wholeRecord = flatDataSource.find( (item) => item[primaryKey] === record[primaryKey] ) return hasSelectedKey(wholeRecord.children, selected, primaryKey) || undefined } interface ICheckSlackly { ( currentSelected: any[], selected: any[], flatDataSource: any[], flatFilteredDataSource: any[], primaryKey: string, checkStrictly: boolean ): { selectedRowKeys: any[] } } // 父子节点(节点状态按全完整数据计算,节点操作按筛选数据计算) const useCheckSlackly: ICheckSlackly = ( currentSelected, // onChange 返回的 keys selected, // Table UI 展示的 keys flatDataSource, flatFilteredDataSource, primaryKey, checkStrictly ) => { let isSelected = currentSelected.length > selected.length // 判断是选中还是取消 const currentKey = [...currentSelected, ...selected].find( (key) => !(currentSelected.includes(key) && selected.includes(key)) // 当前变化key不同时存在于两个selected ) // 从过滤后的数据中获取当前record const currentRecord = flatFilteredDataSource.find( (item) => item[primaryKey] === currentKey ) const currentTreeKeys = getTreeKeys(currentRecord.children, primaryKey) // 在筛选状态下(按钮的indeterminate状态处于异常)需要通过数据对比判断是否处于全选中状态 if ( getCompatibleAllSelected( selected, currentRecord.children, currentTreeKeys, checkStrictly, primaryKey ) ) { isSelected = false } let newSelected = [] if (isSelected) { // 选中当前key及其子keys newSelected = [...new Set([...selected, currentKey, ...currentTreeKeys])] } else { // 移除当前key及其子keys newSelected = selected.filter( (key) => ![currentKey, ...currentTreeKeys].includes(key) ) } newSelected = completedKeys(flatDataSource, newSelected, primaryKey) return { selectedRowKeys: newSelected } } export { useCheckSlackly, getIndeterminate }