import { IStoreState, ID, IRowDimensions, IColDimensions } from '../../index.data'; import * as R from 'rambda'; import { pickPatch } from '../../utils'; import { getAllCollapsedRowFlags } from '../selectors'; import { getAllLoadableRowFlags } from '../../scroll/VScrollBar/helper'; import { getAllLoadableColumnFlags } from '../../scroll/HScrollBar/helper'; export function setDimensions( state: IStoreState, _rowDimensions: IRowDimensions, _colDimensions: IColDimensions, ) { // console.log('setDimensions'); // const collapsedRowIds = getAllCollapsedRowIds(state); const collapsedRowFlags = getAllCollapsedRowFlags(state); const loadableRowFlags = getAllLoadableRowFlags(state); const loadableColumnFlags = getAllLoadableColumnFlags(state); // 原理: // 1. 默认行高为30; // 2. 传入的_rowDimensions是通过dom取到的 offsetHeight/offsetTop // 3. rowIds通过state.rows来取, 最稳定 ( 因state.rowDimension可能存在增删, 而_rowDimensions跟算法有关 ) // 4. 先取到height, 再计算行高 const rowDimensions: IRowDimensions = {}; // 找到第1个可显示行的top ( row indicator的高度 ) const firstVisibleRow = state.rows.find(row => _rowDimensions[row.id].height > 0); let accTop = firstVisibleRow ? _rowDimensions[firstVisibleRow.id].top : 0; let offsetTop = accTop; for (let i = 0; i < state.rows.length; i++) { const row = state.rows[i]; const height = (_rowDimensions[row.id] && _rowDimensions[row.id].height) || (state.rowDimensions[row.id] && state.rowDimensions[row.id].height) || 30; rowDimensions[row.id] = { height, top: accTop, offsetTop, offsetHeight: loadableRowFlags[i] ? height : 0, }; // if (collapsedRowIds.indexOf(row.id) < 0) accTop += height; if (!collapsedRowFlags[i]) accTop += height; if (loadableRowFlags[i]) offsetTop += height; } // 原理同上 const colDimensions: IColDimensions = {}; // 找到第1个可显示列的left ( column indicator的宽度 ) const firstVisibleCol = state.columns.find(col => _colDimensions[col.id!].width > 0); let accLeft = firstVisibleCol ? _colDimensions[firstVisibleCol.id!].left : 0; let offsetLeft = accLeft; for (let i = 0; i < state.columns.length; i++) { const col = state.columns[i]; const width = _colDimensions[col.id!].width || state.colDimensions[col.id!].width || 90; colDimensions[col.id!] = { width, left: accLeft, offsetLeft, offsetWidth: loadableColumnFlags[i] ? width : 0, }; accLeft += width; if (loadableColumnFlags[i]) offsetLeft += width; } const result = pickPatch(state, { rowDimensions, colDimensions, }); // return R.isEmpty(result) ? null : { ...result, readyDimensions: false }; // 这里无论如何都应该返回readyDimensions:false // 原因: 有时滚动发生了, 但未满1格, 所以rowDimensions并未变化, 然后滚动完成后, ReadyDimensions 仍为true // 这将导致selected / presentcell 不会显示 return { ...result, readyDimensions: false }; } export function setContainerBox(state: IStoreState, containerBox: IStoreState['containerBox']) { const result = pickPatch(state, { containerBox }); // 设置containerBox后下一步一定是setDimensions return R.isEmpty(result) ? null : { ...result, readyDimensions: true }; }