Commit c09b2491 by zhaochengxiang

虚拟滚动低版本兼容

parent 90b7e8b0
...@@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef, useMemo } from "react"; ...@@ -2,7 +2,7 @@ import React, { useState, useEffect, useRef, useMemo } from "react";
import { Tooltip, Modal, Table, Typography } from 'antd'; import { Tooltip, Modal, Table, Typography } from 'antd';
import LocalStorage from 'local-storage'; import LocalStorage from 'local-storage';
import DataGrid from '../../VirtualTable'; import DataGrid, { defaultPageSize } from '../../VirtualTable';
import { dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
import { showMessage, getQueryParam, isSzseEnv, formatDate, getDataModelerRole } from '../../../../util'; import { showMessage, getQueryParam, isSzseEnv, formatDate, getDataModelerRole } from '../../../../util';
import { AnchorId, AnchorTimestamp, Action, CatalogId, ModelerId, DataModelerRoleReader } from '../../../../util/constant'; import { AnchorId, AnchorTimestamp, Action, CatalogId, ModelerId, DataModelerRoleReader } from '../../../../util/constant';
...@@ -10,7 +10,6 @@ import ExpandedModelTable from "./ExpandedModelTable"; ...@@ -10,7 +10,6 @@ import ExpandedModelTable from "./ExpandedModelTable";
// import Tag from "../../Tag"; // import Tag from "../../Tag";
import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify"; import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify";
import './ModelTable.less'; import './ModelTable.less';
import 'react-contexify/dist/ReactContexify.css'; import 'react-contexify/dist/ReactContexify.css';
...@@ -99,6 +98,7 @@ const ModelTable = (props) => { ...@@ -99,6 +98,7 @@ const ModelTable = (props) => {
const [ selectedRowKeys, setSelectedRowKeys ] = useState([]); const [ selectedRowKeys, setSelectedRowKeys ] = useState([]);
const [ expandedSelectedRowKeys, setExpandedSelectedRowKeys ] = useState([]); const [ expandedSelectedRowKeys, setExpandedSelectedRowKeys ] = useState([]);
const [ currentItem, setCurrentItem ] = useState(null); const [ currentItem, setCurrentItem ] = useState(null);
const [ scrollRowIndex, setScrollRowIndex ] = useState();
const expandedDataMapRef = useRef(new Map()); const expandedDataMapRef = useRef(new Map());
const shouldScrollRef = useRef(false); const shouldScrollRef = useRef(false);
...@@ -247,6 +247,14 @@ const ModelTable = (props) => { ...@@ -247,6 +247,14 @@ const ModelTable = (props) => {
}, [selectedRowKeys, expandedSelectedRowKeys, data]) }, [selectedRowKeys, expandedSelectedRowKeys, data])
useEffect(() => { useEffect(() => {
if (data && gridRef.current) {
setTimeout(() => {
gridRef.current?.scrollToRow(0);
}, 100)
}
}, [data])
useEffect(() => {
window?.addEventListener("storage", modelEventChange); window?.addEventListener("storage", modelEventChange);
return () => { return () => {
window?.removeEventListener("storage", modelEventChange); window?.removeEventListener("storage", modelEventChange);
...@@ -277,8 +285,9 @@ const ModelTable = (props) => { ...@@ -277,8 +285,9 @@ const ModelTable = (props) => {
useEffect(() => { useEffect(() => {
if (shouldScrollRef.current && gridRef.current && offset!==null && (data||[]).length>0) { if (shouldScrollRef.current && gridRef.current && offset!==null && (data||[]).length>0) {
setScrollRowIndex(offset);
setTimeout(() => { setTimeout(() => {
gridRef.current?.scrollToRow(offset-1); gridRef.current?.scrollToRow((offset-1)%defaultPageSize);
shouldScrollRef.current = false; shouldScrollRef.current = false;
}, 300) }, 300)
} }
...@@ -497,11 +506,15 @@ const ModelTable = (props) => { ...@@ -497,11 +506,15 @@ const ModelTable = (props) => {
style={{ blockSize: 'calc(100vh - 94px - 37px - 57px - 24px - 32px)' }} style={{ blockSize: 'calc(100vh - 94px - 37px - 57px - 24px - 32px)' }}
checkable checkable
columns={columns} columns={columns}
// rows={Array.from({ length: 10000 }).map((_, i) => ({
// name: 'test',
// }))}
rows={data||[]} rows={data||[]}
rowHeight={51} rowHeight={51}
rowClassName={(row) => { rowClassName={(row) => {
return (row.id === anchorId)?'anchor':'' return (row.id === anchorId)?'anchor':''
}} }}
scrollRowIndex={scrollRowIndex}
expandable={expandable} expandable={expandable}
onContextMenu={(e, row) => { onContextMenu={(e, row) => {
setCurrentItem(row); setCurrentItem(row);
......
...@@ -6,6 +6,7 @@ import type { CheckboxChangeEvent } from 'antd/es/checkbox'; ...@@ -6,6 +6,7 @@ import type { CheckboxChangeEvent } from 'antd/es/checkbox';
import { DownOutlined, UpOutlined } from '@ant-design/icons'; import { DownOutlined, UpOutlined } from '@ant-design/icons';
import { downNode, upNode } from './virtual-table-helper'; import { downNode, upNode } from './virtual-table-helper';
import { paginate } from '../../../util';
import './index.less'; import './index.less';
...@@ -43,6 +44,7 @@ interface Props<Row> { ...@@ -43,6 +44,7 @@ interface Props<Row> {
onSelectedRowsChange?: (selectedRows: Array<any>) => void onSelectedRowsChange?: (selectedRows: Array<any>) => void
rowHeight?: number rowHeight?: number
rowClassName?: (row: RowData) => string rowClassName?: (row: RowData) => string
scrollRowIndex: number
} }
const CheckboxFormatter = forwardRef<HTMLInputElement, CheckboxFormatterProps>( const CheckboxFormatter = forwardRef<HTMLInputElement, CheckboxFormatterProps>(
...@@ -102,13 +104,15 @@ export function getExpandingCol<Row extends RowData, SR>({ colSpan, expandRender ...@@ -102,13 +104,15 @@ export function getExpandingCol<Row extends RowData, SR>({ colSpan, expandRender
return col return col
} }
export const defaultPageSize = 800
function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: DataGridProps<Row, SR, K> & Props<Row>) { function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: DataGridProps<Row, SR, K> & Props<Row>) {
const { const {
gridRef, gridRef,
expandable, expandable,
getComparator, getComparator,
loadMoreRows, loadMoreRows,
onSelectedRowsChange, columns, rows, checkable, selectedRows, rowHeight = 45, rowClassName, onContextMenu, ...rest } = props onSelectedRowsChange, columns, rows, checkable, selectedRows, rowHeight = 45, rowClassName, onContextMenu, scrollRowIndex, ...rest } = props
const rowKeyGetter = (row: Row): K => { const rowKeyGetter = (row: Row): K => {
return row.id as K; return row.id as K;
...@@ -135,10 +139,27 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat ...@@ -135,10 +139,27 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat
// 已排序行 // 已排序行
const [sortColumns, setSortColumns] = useState<readonly SortColumn[]>([]); // 排序列图标状态 const [sortColumns, setSortColumns] = useState<readonly SortColumn[]>([]); // 排序列图标状态
const [_rows, _setRows] = useState<readonly Row[]>([]) const [_rows, _setRows] = useState<readonly Row[]>([])
const [pagination, setPagination] = useState({ pageNum: 1, pageSize: defaultPageSize });
const {pageNum, pageSize} = pagination;
useEffect(() => { useEffect(() => {
const newRows = [...rows]; if (rows) {
setPagination(prev => {
return {...prev, pageNum: 1}
})
}
}, [rows])
useEffect(() => {
if (scrollRowIndex) {
setPagination(prev => {
return {...prev, pageNum: parseInt((scrollRowIndex/defaultPageSize + ((scrollRowIndex%defaultPageSize===0)?0:1)).toString())}
})
}
}, [scrollRowIndex])
useEffect(() => {
const newRows = [...paginate(rows, pageNum, pageSize)];
if (sortColumns.length > 0) { if (sortColumns.length > 0) {
newRows newRows
// .filter(item => item.__type__ !== RowType.Detail) // .filter(item => item.__type__ !== RowType.Detail)
...@@ -155,12 +176,11 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat ...@@ -155,12 +176,11 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat
} }
(newRows||[]).forEach((item, index) => { (newRows||[]).forEach((item, index) => {
item.index = `${index+1}`; item.index = `${(pageNum-1)*pageSize+index+1}`;
}) })
_setRows(newRows); _setRows(newRows);
}, [rows, sortColumns, getComparator]); }, [sortColumns, getComparator, pagination]);
// 组装功能s列 // 组装功能s列
const cols = useMemo(() => { const cols = useMemo(() => {
...@@ -196,9 +216,23 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat ...@@ -196,9 +216,23 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat
// 处理滚动 // 处理滚动
const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => { const handleScroll = useCallback((event: React.UIEvent<HTMLDivElement>) => {
if (!isAtBottom(event)) return; if (isAtTop(event)) {
loadMoreRows?.(rows.length) if (pageNum > 1) {
}, [loadMoreRows, rows]) setPagination(prev => {
return {...prev, pageNum: prev.pageNum-1}
})
}
} else if (isAtBottom(event)) {
if (rows?.length > pageNum* pageSize) {
event.currentTarget.scrollTop = 0;
setPagination(prev => {
return {...prev, pageNum: prev.pageNum+1}
})
}
}
// loadMoreRows?.(rows.length)
}, [loadMoreRows, rows, pageNum])
return ( return (
<div className='virtual-table'> <div className='virtual-table'>
...@@ -243,7 +277,7 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat ...@@ -243,7 +277,7 @@ function FC<Row extends RowData, SR, K extends React.Key = React.Key>(props: Dat
onSelectedRowsChange && onSelectedRowsChange(Array.from(values)); onSelectedRowsChange && onSelectedRowsChange(Array.from(values));
}} }}
// 滚动 // 滚动
onScroll={loadMoreRows ? handleScroll : undefined} onScroll={handleScroll}
/> />
</div> </div>
); );
...@@ -260,6 +294,10 @@ function GetComparator(sortColumn: string): (a: any, b: any) => number { ...@@ -260,6 +294,10 @@ function GetComparator(sortColumn: string): (a: any, b: any) => number {
}; };
} }
function isAtTop({ currentTarget }: React.UIEvent<HTMLDivElement>): boolean {
return currentTarget.scrollTop === 0;
}
function isAtBottom({ currentTarget }: React.UIEvent<HTMLDivElement>): boolean { function isAtBottom({ currentTarget }: React.UIEvent<HTMLDivElement>): boolean {
return currentTarget.scrollTop + 10 >= currentTarget.scrollHeight - currentTarget.clientHeight; return currentTarget.scrollTop + 10 >= currentTarget.scrollHeight - currentTarget.clientHeight;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment