Refactor ObjectTable component to utilize refs for table filter and sorter management

- Replaced state management for tableFilter and tableSorter with refs for improved performance and reduced re-renders.
- Introduced tableData state to manage flattened data for display.
- Updated data fetching logic to reference current filter and sorter values from refs.
- Enhanced useEffect to flatten pages array for table display.
This commit is contained in:
Tom Butcher 2025-12-07 02:42:18 +00:00
parent 2879b8648d
commit f7532338b6

View File

@ -88,8 +88,8 @@ const ObjectTable = forwardRef(
const [, contextHolder] = message.useMessage()
const tableRef = useRef(null)
const model = getModelByName(type)
const [tableFilter, setTableFilter] = useState({})
const [tableSorter, setTableSorter] = useState({})
const tableFilterRef = useRef({})
const tableSorterRef = useRef({})
const [initialized, setInitialized] = useState(false)
// Table state
@ -98,6 +98,7 @@ const ObjectTable = forwardRef(
const [hasMore, setHasMore] = useState(true)
const [loading, setLoading] = useState(true)
const [lazyLoading, setLazyLoading] = useState(false)
const [tableData, setTableData] = useState([])
const subscribedIdsRef = useRef([])
// const [typeSubscribed, setTypeSubscribed] = useState(false)
@ -159,17 +160,17 @@ const ObjectTable = forwardRef(
const fetchData = useCallback(
async (pageNum = 1, filter = null, sorter = null) => {
if (filter == null) {
filter = tableFilter
filter = tableFilterRef.current
} else {
setTableFilter(filter)
tableFilterRef.current = filter
}
if (sorter == null) {
sorter = tableSorter
sorter = tableSorterRef.current
} else {
setTableSorter({
tableSorterRef.current = {
field: sorter.field,
order: sorter.order
})
}
}
console.log('Fetching data...')
try {
@ -213,15 +214,7 @@ const ObjectTable = forwardRef(
throw error
}
},
[
type,
masterFilter,
pageSize,
tableFilter,
tableSorter,
onDataChange,
fetchObjects
]
[type, masterFilter, pageSize, onDataChange, fetchObjects]
)
const loadNextPage = useCallback(() => {
@ -480,8 +473,8 @@ const ObjectTable = forwardRef(
if (hasChanged) {
setPages([])
setTableFilter({})
setTableSorter({})
tableFilterRef.current = {}
tableSorterRef.current = {}
setInitialized(false)
setLoading(true)
setLazyLoading(false)
@ -560,6 +553,12 @@ const ObjectTable = forwardRef(
useEffect(() => {
pagesRef.current = pages
}, [pages])
// Flatten pages array for table display
useEffect(() => {
setTableData(pages.flatMap((page) => page.items))
}, [pages])
// Add columns in the order specified by model.columns
model.columns.forEach((colName) => {
const prop = modelProperties.find((p) => p.name === colName)
@ -601,9 +600,8 @@ const ObjectTable = forwardRef(
const isSortable = model.sorters && model.sorters.includes(prop.name)
const columnConfig = {
sorter: isSortable,
sorter: isSortable ? { multiple: 1 } : undefined,
title: prop.label,
dataIndex: prop.name,
width: prop.columnWidth || width,
fixed: isMobile ? undefined : fixed,
key: prop.name,
@ -663,9 +661,6 @@ const ObjectTable = forwardRef(
})
}
// Flatten pages array for table display
const tableData = pages.flatMap((page) => page.items)
// Card view rendering
const cardsContainerRef = useRef(null)