From d773321666e57c2f535f8bd8a01927b66e5461c3 Mon Sep 17 00:00:00 2001 From: "ouxiaofeng.utlf" Date: Fri, 24 Oct 2025 16:21:14 +0800 Subject: [PATCH] feat: add forceRender api --- docs/examples/expandedRowRender.tsx | 3 +++ src/Body/BodyRow.tsx | 11 ++++++++++- src/Body/index.tsx | 3 +++ src/Table.tsx | 3 +++ src/context/TableContext.tsx | 1 + src/interface.ts | 1 + 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/docs/examples/expandedRowRender.tsx b/docs/examples/expandedRowRender.tsx index 791f5a7c7..5c4c7d059 100644 --- a/docs/examples/expandedRowRender.tsx +++ b/docs/examples/expandedRowRender.tsx @@ -146,6 +146,9 @@ const Demo = () => { rowExpandable, expandIconColumnIndex: expandIconPosition ? 1 : null, fixed: fixExpand, + forceRender: record => { + return record?.key === 0; + }, }} scroll={{ x: fixColumns || scrollX ? 2000 : null, y: fixHeader ? 300 : null }} data={data} diff --git a/src/Body/BodyRow.tsx b/src/Body/BodyRow.tsx index aae9f4c7b..4271d92a2 100644 --- a/src/Body/BodyRow.tsx +++ b/src/Body/BodyRow.tsx @@ -31,6 +31,7 @@ export interface BodyRowProps { colSpan: number; sticky: number; }; + forceRender?: boolean | ((record: RecordType, index: number) => boolean); } // ================================================================================== @@ -138,6 +139,7 @@ const BodyRow = ( cellComponent, scopeCellComponent, expandedRowInfo, + forceRender, } = props; const rowInfo = useRowInfo(record, rowKey, index, indent); @@ -157,6 +159,13 @@ const BodyRow = ( const expandedRef = React.useRef(false); expandedRef.current ||= expanded; + const shouldForceRender = () => { + if (typeof forceRender === 'function') { + return forceRender(record, index); + } + return !!forceRender; + }; + if (process.env.NODE_ENV !== 'production') { devRenderTimes(props); } @@ -224,7 +233,7 @@ const BodyRow = ( // ======================== Expand Row ========================= let expandRowNode: React.ReactElement; - if (rowSupportExpand && (expandedRef.current || expanded)) { + if (rowSupportExpand && (expandedRef.current || expanded || shouldForceRender?.())) { const expandContent = expandedRowRender(record, index, indent + 1, expanded); expandRowNode = ( diff --git a/src/Body/index.tsx b/src/Body/index.tsx index ade0f5bf8..7476ccff5 100644 --- a/src/Body/index.tsx +++ b/src/Body/index.tsx @@ -36,6 +36,7 @@ const Body = (props: BodyProps) => { styles, expandedRowOffset = 0, colWidths, + forceRender } = useContext(TableContext, [ 'prefixCls', 'getComponent', @@ -50,6 +51,7 @@ const Body = (props: BodyProps) => { 'expandedRowOffset', 'fixedInfoList', 'colWidths', + 'forceRender' ]); const { body: bodyCls = {} } = classNames || {}; const { body: bodyStyles = {} } = styles || {}; @@ -111,6 +113,7 @@ const Body = (props: BodyProps) => { indent={indent} // Expanded row info expandedRowInfo={expandedRowInfo} + forceRender={forceRender} /> ); }); diff --git a/src/Table.tsx b/src/Table.tsx index a8431dc4c..9c9d21f0e 100644 --- a/src/Table.tsx +++ b/src/Table.tsx @@ -892,6 +892,7 @@ const Table = ( expandableType, expandRowByClick: expandableConfig.expandRowByClick, expandedRowRender: expandableConfig.expandedRowRender, + forceRender: expandableConfig.forceRender, expandedRowOffset: expandableConfig.expandedRowOffset, onTriggerExpand, expandIconColumnIndex: expandableConfig.expandIconColumnIndex, @@ -953,6 +954,8 @@ const Table = ( onTriggerExpand, expandableConfig.expandIconColumnIndex, expandableConfig.indentSize, + expandableConfig.forceRender, + expandableConfig, emptyNode, // Column diff --git a/src/context/TableContext.tsx b/src/context/TableContext.tsx index 19acc6366..a62925cbb 100644 --- a/src/context/TableContext.tsx +++ b/src/context/TableContext.tsx @@ -53,6 +53,7 @@ export interface TableContextProps { expandableType: ExpandableType; expandRowByClick: boolean; expandedRowRender: ExpandedRowRender; + forceRender?: boolean | ((record: RecordType) => boolean); expandIcon: RenderExpandIcon; onTriggerExpand: TriggerEventHandler; expandIconColumnIndex: number; diff --git a/src/interface.ts b/src/interface.ts index 2c2d67801..b6cd6375f 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -267,6 +267,7 @@ export interface ExpandableConfig { columnWidth?: number | string; fixed?: FixedType; expandedRowOffset?: number; + forceRender?: boolean|((record: RecordType) => boolean); } // =================== Render ===================