1
0
mirror of synced 2025-12-10 07:58:13 +08:00

优化渲染

This commit is contained in:
xuliangzhan
2023-09-02 12:17:46 +08:00
parent f0e35ed402
commit e988105fb5
4 changed files with 37 additions and 32 deletions

View File

@@ -442,11 +442,8 @@ export default defineComponent({
) )
} }
// 如果是树形表格 // 如果是树形表格
if (treeConfig && !scrollYLoad && !transform) { if (isExpandTree) {
const rowChildren = row[childrenField] rows.push(...renderRows(fixedType, rowChildren, tableColumn))
if (rowChildren && rowChildren.length && treeExpandedMaps[rowid]) {
rows.push(...renderRows(fixedType, rowChildren, tableColumn))
}
} }
}) })
return rows return rows

View File

@@ -446,9 +446,9 @@ export const Cell = {
let isChecked = false let isChecked = false
const isVisible = !visibleMethod || visibleMethod({ row }) const isVisible = !visibleMethod || visibleMethod({ row })
let isDisabled = !!checkMethod let isDisabled = !!checkMethod
const rowid = getRowid($table, row)
let ons let ons
if (!isHidden) { if (!isHidden) {
const rowid = getRowid($table, row)
isChecked = !!selectCheckboxMaps[rowid] isChecked = !!selectCheckboxMaps[rowid]
ons = { ons = {
onClick (evnt: MouseEvent) { onClick (evnt: MouseEvent) {
@@ -516,6 +516,7 @@ export const Cell = {
let isDisabled = !!checkMethod let isDisabled = !!checkMethod
let ons let ons
if (!isHidden) { if (!isHidden) {
const rowid = getRowid($table, row)
isChecked = XEUtils.get(row, checkField as string) isChecked = XEUtils.get(row, checkField as string)
ons = { ons = {
onClick (evnt: MouseEvent) { onClick (evnt: MouseEvent) {
@@ -529,7 +530,7 @@ export const Cell = {
isDisabled = !checkMethod({ row }) isDisabled = !checkMethod({ row })
} }
if (treeConfig) { if (treeConfig) {
isIndeterminate = !!treeIndeterminateMaps[getRowid($table, row)] isIndeterminate = !!treeIndeterminateMaps[rowid]
} }
} }
const checkboxParams = { ...params, checked: isChecked, disabled: isDisabled, visible: isVisible, indeterminate: isIndeterminate } const checkboxParams = { ...params, checked: isChecked, disabled: isDisabled, visible: isVisible, indeterminate: isIndeterminate }

View File

@@ -2048,16 +2048,16 @@ export default defineComponent({
} }
const handleAsyncTreeExpandChilds = (row: any): Promise<void> => { const handleAsyncTreeExpandChilds = (row: any): Promise<void> => {
const { treeExpandedMaps, treeExpandLazyLoadedMaps } = reactData
const { fullAllDataRowIdData } = internalData
const treeOpts = computeTreeOpts.value const treeOpts = computeTreeOpts.value
const checkboxOpts = computeCheckboxOpts.value const checkboxOpts = computeCheckboxOpts.value
const { transform, loadMethod } = treeOpts const { transform, loadMethod } = treeOpts
const { checkStrictly } = checkboxOpts const { checkStrictly } = checkboxOpts
const rowid = getRowid($xetable, row)
const rest = fullAllDataRowIdData[rowid]
return new Promise(resolve => { return new Promise(resolve => {
if (loadMethod) { if (loadMethod) {
const { treeExpandLazyLoadedMaps } = reactData
const { fullAllDataRowIdData } = internalData
const rowid = getRowid($xetable, row)
const rest = fullAllDataRowIdData[rowid]
treeExpandLazyLoadedMaps[rowid] = row treeExpandLazyLoadedMaps[rowid] = row
loadMethod({ $table: $xetable, row }).then((childRecords: any) => { loadMethod({ $table: $xetable, row }).then((childRecords: any) => {
rest.treeLoaded = true rest.treeLoaded = true
@@ -2069,6 +2069,7 @@ export default defineComponent({
} }
if (childRecords) { if (childRecords) {
return tableMethods.loadTreeChildren(row, childRecords).then(childRows => { return tableMethods.loadTreeChildren(row, childRecords).then(childRows => {
const { treeExpandedMaps } = reactData
if (childRows.length && !treeExpandedMaps[rowid]) { if (childRows.length && !treeExpandedMaps[rowid]) {
treeExpandedMaps[rowid] = row treeExpandedMaps[rowid] = row
} }
@@ -2084,6 +2085,7 @@ export default defineComponent({
}) })
} }
}).catch(() => { }).catch(() => {
const { treeExpandLazyLoadedMaps } = reactData
rest.treeLoaded = false rest.treeLoaded = false
if (treeExpandLazyLoadedMaps[rowid]) { if (treeExpandLazyLoadedMaps[rowid]) {
delete treeExpandLazyLoadedMaps[rowid] delete treeExpandLazyLoadedMaps[rowid]
@@ -2111,21 +2113,23 @@ export default defineComponent({
} }
const handleAsyncRowExpand = (row: any): Promise<void> => { const handleAsyncRowExpand = (row: any): Promise<void> => {
const { fullAllDataRowIdData } = internalData
const { rowExpandLazyLoadedMaps, rowExpandedMaps } = reactData
return new Promise(resolve => { return new Promise(resolve => {
const expandOpts = computeExpandOpts.value const expandOpts = computeExpandOpts.value
const { loadMethod } = expandOpts const { loadMethod } = expandOpts
if (loadMethod) { if (loadMethod) {
const { fullAllDataRowIdData } = internalData
const { rowExpandLazyLoadedMaps } = reactData
const rowid = getRowid($xetable, row) const rowid = getRowid($xetable, row)
const rest = fullAllDataRowIdData[rowid] const rest = fullAllDataRowIdData[rowid]
rowExpandLazyLoadedMaps[rowid] = row rowExpandLazyLoadedMaps[rowid] = row
loadMethod({ $table: $xetable, row, rowIndex: tableMethods.getRowIndex(row), $rowIndex: tableMethods.getVMRowIndex(row) }).then(() => { loadMethod({ $table: $xetable, row, rowIndex: tableMethods.getRowIndex(row), $rowIndex: tableMethods.getVMRowIndex(row) }).then(() => {
const { rowExpandedMaps } = reactData
rest.expandLoaded = true rest.expandLoaded = true
rowExpandedMaps[rowid] = row rowExpandedMaps[rowid] = row
}).catch(() => { }).catch(() => {
rest.expandLoaded = false rest.expandLoaded = false
}).finally(() => { }).finally(() => {
const { rowExpandLazyLoadedMaps } = reactData
if (rowExpandLazyLoadedMaps[rowid]) { if (rowExpandLazyLoadedMaps[rowid]) {
delete rowExpandLazyLoadedMaps[rowid] delete rowExpandLazyLoadedMaps[rowid]
} }
@@ -2547,6 +2551,7 @@ export default defineComponent({
*/ */
const handleBaseTreeExpand = (rows: any[], expanded: boolean) => { const handleBaseTreeExpand = (rows: any[], expanded: boolean) => {
const { treeExpandedMaps, treeExpandLazyLoadedMaps, treeNodeColumn } = reactData const { treeExpandedMaps, treeExpandLazyLoadedMaps, treeNodeColumn } = reactData
const treeTempExpandedMaps = { ...treeExpandedMaps }
const { fullAllDataRowIdData, tableFullData } = internalData const { fullAllDataRowIdData, tableFullData } = internalData
const treeOpts = computeTreeOpts.value const treeOpts = computeTreeOpts.value
const { reserve, lazy, accordion, toggleMethod } = treeOpts const { reserve, lazy, accordion, toggleMethod } = treeOpts
@@ -2563,8 +2568,8 @@ export default defineComponent({
if (matchObj) { if (matchObj) {
matchObj.items.forEach(item => { matchObj.items.forEach(item => {
const rowid = getRowid($xetable, item) const rowid = getRowid($xetable, item)
if (treeExpandedMaps[rowid]) { if (treeTempExpandedMaps[rowid]) {
delete treeExpandedMaps[rowid] delete treeTempExpandedMaps[rowid]
} }
}) })
} }
@@ -2572,7 +2577,7 @@ export default defineComponent({
if (expanded) { if (expanded) {
validRows.forEach((row: any) => { validRows.forEach((row: any) => {
const rowid = getRowid($xetable, row) const rowid = getRowid($xetable, row)
if (!treeExpandedMaps[rowid]) { if (!treeTempExpandedMaps[rowid]) {
const rest = fullAllDataRowIdData[rowid] const rest = fullAllDataRowIdData[rowid]
const isLoad = lazy && row[hasChildField] && !rest.treeLoaded && !treeExpandLazyLoadedMaps[rowid] const isLoad = lazy && row[hasChildField] && !rest.treeLoaded && !treeExpandLazyLoadedMaps[rowid]
// 是否使用懒加载 // 是否使用懒加载
@@ -2580,7 +2585,7 @@ export default defineComponent({
result.push(handleAsyncTreeExpandChilds(row)) result.push(handleAsyncTreeExpandChilds(row))
} else { } else {
if (row[childrenField] && row[childrenField].length) { if (row[childrenField] && row[childrenField].length) {
treeExpandedMaps[rowid] = row treeTempExpandedMaps[rowid] = row
} }
} }
} }
@@ -2588,14 +2593,15 @@ export default defineComponent({
} else { } else {
validRows.forEach(item => { validRows.forEach(item => {
const rowid = getRowid($xetable, item) const rowid = getRowid($xetable, item)
if (treeExpandedMaps[rowid]) { if (treeTempExpandedMaps[rowid]) {
delete treeExpandedMaps[rowid] delete treeTempExpandedMaps[rowid]
} }
}) })
} }
if (reserve) { if (reserve) {
validRows.forEach((row: any) => handleTreeExpandReserve(row, expanded)) validRows.forEach((row: any) => handleTreeExpandReserve(row, expanded))
} }
reactData.treeExpandedMaps = treeTempExpandedMaps
return Promise.all(result).then(() => { return Promise.all(result).then(() => {
return tableMethods.recalculate() return tableMethods.recalculate()
}) })
@@ -3440,7 +3446,7 @@ export default defineComponent({
}, },
isIndeterminateByCheckboxRow (row) { isIndeterminateByCheckboxRow (row) {
const { treeIndeterminateMaps } = reactData const { treeIndeterminateMaps } = reactData
return treeIndeterminateMaps[getRowid($xetable, row)] && !tableMethods.isCheckedByCheckboxRow(row) return !!treeIndeterminateMaps[getRowid($xetable, row)] && !tableMethods.isCheckedByCheckboxRow(row)
}, },
/** /**
* 多选,切换某一行的选中状态 * 多选,切换某一行的选中状态
@@ -3868,8 +3874,9 @@ export default defineComponent({
* @param {Boolean} expanded 是否展开 * @param {Boolean} expanded 是否展开
*/ */
setRowExpand (rows, expanded) { setRowExpand (rows, expanded) {
let { rowExpandedMaps, rowExpandLazyLoadedMaps, expandColumn: column } = reactData const { rowExpandedMaps, rowExpandLazyLoadedMaps, expandColumn: column } = reactData
const { fullAllDataRowIdData } = internalData const { fullAllDataRowIdData } = internalData
let rExpandedMaps = { ...rowExpandedMaps }
const expandOpts = computeExpandOpts.value const expandOpts = computeExpandOpts.value
const { reserve, lazy, accordion, toggleMethod } = expandOpts const { reserve, lazy, accordion, toggleMethod } = expandOpts
const lazyRests: any[] = [] const lazyRests: any[] = []
@@ -3881,28 +3888,28 @@ export default defineComponent({
} }
if (accordion) { if (accordion) {
// 只能同时展开一个 // 只能同时展开一个
rowExpandedMaps = {} rExpandedMaps = {}
rows = rows.slice(rows.length - 1, rows.length) rows = rows.slice(rows.length - 1, rows.length)
} }
const validRows: any[] = toggleMethod ? rows.filter((row: any) => toggleMethod({ $table: $xetable, expanded, column, columnIndex, $columnIndex, row, rowIndex: tableMethods.getRowIndex(row), $rowIndex: tableMethods.getVMRowIndex(row) })) : rows const validRows: any[] = toggleMethod ? rows.filter((row: any) => toggleMethod({ $table: $xetable, expanded, column, columnIndex, $columnIndex, row, rowIndex: tableMethods.getRowIndex(row), $rowIndex: tableMethods.getVMRowIndex(row) })) : rows
if (expanded) { if (expanded) {
validRows.forEach((row: any) => { validRows.forEach((row: any) => {
const rowid = getRowid($xetable, row) const rowid = getRowid($xetable, row)
if (!rowExpandedMaps[rowid]) { if (!rExpandedMaps[rowid]) {
const rest = fullAllDataRowIdData[rowid] const rest = fullAllDataRowIdData[rowid]
const isLoad = lazy && !rest.expandLoaded && !rowExpandLazyLoadedMaps[rowid] const isLoad = lazy && !rest.expandLoaded && !rowExpandLazyLoadedMaps[rowid]
if (isLoad) { if (isLoad) {
lazyRests.push(handleAsyncRowExpand(row)) lazyRests.push(handleAsyncRowExpand(row))
} else { } else {
rowExpandedMaps[rowid] = row rExpandedMaps[rowid] = row
} }
} }
}) })
} else { } else {
validRows.forEach(item => { validRows.forEach(item => {
const rowid = getRowid($xetable, item) const rowid = getRowid($xetable, item)
if (rowExpandedMaps[rowid]) { if (rExpandedMaps[rowid]) {
delete rowExpandedMaps[rowid] delete rExpandedMaps[rowid]
} }
}) })
} }
@@ -3910,7 +3917,7 @@ export default defineComponent({
validRows.forEach((row: any) => handleRowExpandReserve(row, expanded)) validRows.forEach((row: any) => handleRowExpandReserve(row, expanded))
} }
} }
reactData.rowExpandedMaps = rowExpandedMaps reactData.rowExpandedMaps = rExpandedMaps
return Promise.all(lazyRests).then(() => tableMethods.recalculate()) return Promise.all(lazyRests).then(() => tableMethods.recalculate())
}, },
/** /**

10
types/table.d.ts vendored
View File

@@ -833,17 +833,17 @@ export interface TableReactData<D = VxeTableDataRow> {
expandColumn: any expandColumn: any
hasFixedColumn: boolean hasFixedColumn: boolean
// 已展开的行 // 已展开的行
rowExpandedMaps: Record<string, D> rowExpandedMaps: Record<string, D | null>
// 懒加载中的展开行 // 懒加载中的展开行
rowExpandLazyLoadedMaps: Record<string, D> rowExpandLazyLoadedMaps: Record<string, D | null>
// 树节点列信息 // 树节点列信息
treeNodeColumn: any treeNodeColumn: any
// 已展开树节点 // 已展开树节点
treeExpandedMaps: Record<string, D> treeExpandedMaps: Record<string, D | null>
// 懒加载中的树节点的集合 // 懒加载中的树节点的集合
treeExpandLazyLoadedMaps: Record<string, D> treeExpandLazyLoadedMaps: Record<string, D | null>
// 树节点不确定状态的集合 // 树节点不确定状态的集合
treeIndeterminateMaps: Record<string, D> treeIndeterminateMaps: Record<string, D | null>
// 合并单元格的对象集 // 合并单元格的对象集
mergeList: VxeTableDefines.MergeItem<D>[] mergeList: VxeTableDefines.MergeItem<D>[]
// 合并表尾数据的对象集 // 合并表尾数据的对象集