committed by
GitHub
4 changed files with 63 additions and 0 deletions
@ -0,0 +1,55 @@ |
|||
import type { ComputedRef, Ref } from 'vue'; |
|||
import { nextTick, unref } from 'vue'; |
|||
import { warn } from '/@/utils/log'; |
|||
|
|||
export function useTableScrollTo( |
|||
tableElRef: Ref<ComponentRef>, |
|||
getDataSourceRef: ComputedRef<Recordable[]>, |
|||
) { |
|||
let bodyEl: HTMLElement | null; |
|||
|
|||
async function findTargetRowToScroll(targetRowData: Recordable) { |
|||
const { id } = targetRowData; |
|||
const targetRowEl: HTMLElement | null | undefined = bodyEl?.querySelector( |
|||
`[data-row-key="${id}"]`, |
|||
); |
|||
//Add a delay to get new dataSource
|
|||
await nextTick(); |
|||
bodyEl?.scrollTo({ |
|||
top: targetRowEl?.offsetTop ?? 0, |
|||
behavior: 'smooth', |
|||
}); |
|||
} |
|||
|
|||
function scrollTo(pos: string): void { |
|||
const table = unref(tableElRef); |
|||
if (!table) return; |
|||
|
|||
const tableEl: Element = table.$el; |
|||
if (!tableEl) return; |
|||
|
|||
if (!bodyEl) { |
|||
bodyEl = tableEl.querySelector('.ant-table-body'); |
|||
if (!bodyEl) return; |
|||
} |
|||
|
|||
const dataSource = unref(getDataSourceRef); |
|||
if (!dataSource) return; |
|||
|
|||
// judge pos type
|
|||
if (pos === 'top') { |
|||
findTargetRowToScroll(dataSource[0]); |
|||
} else if (pos === 'bottom') { |
|||
findTargetRowToScroll(dataSource[dataSource.length - 1]); |
|||
} else { |
|||
const targetRowData = dataSource.find((data) => data.id === pos); |
|||
if (targetRowData) { |
|||
findTargetRowToScroll(targetRowData); |
|||
} else { |
|||
warn(`id: ${pos} doesn't exist`); |
|||
} |
|||
} |
|||
} |
|||
|
|||
return { scrollTo }; |
|||
} |
|||
Loading…
Reference in new issue