fix: update buffer rows

This commit is contained in:
Yourz
2026-01-06 00:01:48 +08:00
parent f06649ae42
commit cc3509430b
2 changed files with 10 additions and 13 deletions

View File

@@ -42,11 +42,11 @@
<ContextMenu ref="menu" :model="menuItems" /> <ContextMenu ref="menu" :model="menuItems" />
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { useElementSize, useScroll, whenever } from '@vueuse/core'
import { clamp } from 'es-toolkit/compat'
import ContextMenu from 'primevue/contextmenu' import ContextMenu from 'primevue/contextmenu'
import type { MenuItem, MenuItemCommandEvent } from 'primevue/menuitem' import type { MenuItem, MenuItemCommandEvent } from 'primevue/menuitem'
import Tree from 'primevue/tree' import Tree from 'primevue/tree'
import { useElementSize, useScroll, whenever } from '@vueuse/core'
import { clamp } from 'es-toolkit/compat'
import { computed, provide, ref, watch } from 'vue' import { computed, provide, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
@@ -98,17 +98,16 @@ const {
} }
) )
const BUFFER_ROWS = 2 const BUFFER_ROWS = 10
const DEFAULT_NODE_HEIGHT = 32 const DEFAULT_NODE_HEIGHT = 32
const SCROLL_THROTTLE = 64 const SCROLL_THROTTLE = 64
const parentWindowRanges = ref<Record<string, WindowRange>>({}) const parentWindowRanges = ref<Record<string, WindowRange>>({})
const treeContainerRef = ref<HTMLDivElement | null>(null) const treeContainerRef = ref<HTMLDivElement | null>(null)
const menu = ref<InstanceType<typeof ContextMenu> | null>(null) const menu = ref<InstanceType<typeof ContextMenu> | null>(null)
const menuTargetNode = ref<RenderedTreeExplorerNode | null>(null) const menuTargetNode = ref<RenderedTreeExplorerNode | null>(null)
const renameEditingNode = ref<RenderedTreeExplorerNode | null>(null) const renameEditingNode = ref<RenderedTreeExplorerNode | null>(null)
const bufferRowsRef = ref(BUFFER_ROWS)
const { height: containerHeight } = useElementSize(treeContainerRef) const { height: containerHeight } = useElementSize(treeContainerRef)
const { y: scrollY } = useScroll(treeContainerRef, { const { y: scrollY } = useScroll(treeContainerRef, {
@@ -136,6 +135,7 @@ const updateWindows = () => {
const viewRows = Math.ceil(containerHeight.value / DEFAULT_NODE_HEIGHT) const viewRows = Math.ceil(containerHeight.value / DEFAULT_NODE_HEIGHT)
const offsetRows = Math.floor(scrollY.value / DEFAULT_NODE_HEIGHT) const offsetRows = Math.floor(scrollY.value / DEFAULT_NODE_HEIGHT)
bufferRowsRef.value = viewRows / 3
const updateNodeWindow = (node: RenderedTreeExplorerNode) => { const updateNodeWindow = (node: RenderedTreeExplorerNode) => {
if (!node.children || node.leaf) return if (!node.children || node.leaf) return
@@ -150,14 +150,14 @@ const updateWindows = () => {
const currentRange = parentWindowRanges.value[node.key] const currentRange = parentWindowRanges.value[node.key]
if (currentRange) { if (currentRange) {
const fromRow = Math.max(0, offsetRows - BUFFER_ROWS) const fromRow = Math.max(0, offsetRows - bufferRowsRef.value)
const toRow = offsetRows + BUFFER_ROWS + viewRows const toRow = offsetRows + bufferRowsRef.value + viewRows
const newStart = clamp(fromRow, 0, totalChildren) const newStart = clamp(fromRow, 0, totalChildren)
const newEnd = clamp(toRow, newStart, totalChildren) const newEnd = clamp(toRow, newStart, totalChildren)
if ( if (
Math.abs(currentRange.start - newStart) > BUFFER_ROWS || Math.abs(currentRange.start - newStart) > bufferRowsRef.value ||
Math.abs(currentRange.end - newEnd) > BUFFER_ROWS Math.abs(currentRange.end - newEnd) > bufferRowsRef.value
) { ) {
parentWindowRanges.value[node.key] = { parentWindowRanges.value[node.key] = {
start: newStart, start: newStart,
@@ -165,7 +165,7 @@ const updateWindows = () => {
} }
} }
} else { } else {
const windowSize = viewRows + BUFFER_ROWS * 2 const windowSize = viewRows + bufferRowsRef.value * 2
parentWindowRanges.value[node.key] = createInitialWindowRange( parentWindowRanges.value[node.key] = createInitialWindowRange(
totalChildren, totalChildren,
windowSize windowSize
@@ -217,7 +217,6 @@ whenever(
} }
) )
const getTreeNodeIcon = (node: TreeExplorerNode): string => { const getTreeNodeIcon = (node: TreeExplorerNode): string => {
if (node.getIcon) { if (node.getIcon) {
const icon = node.getIcon() const icon = node.getIcon()
@@ -252,7 +251,6 @@ const renderedRoot = computed<RenderedTreeExplorerNode>(() => {
return newFolderNode.value ? combineTrees(root, newFolderNode.value) : root return newFolderNode.value ? combineTrees(root, newFolderNode.value) : root
}) })
// Build a lookup map for O(1) node access instead of O(n) tree traversal // Build a lookup map for O(1) node access instead of O(n) tree traversal
const nodeKeyMap = computed<Record<string, RenderedTreeExplorerNode>>(() => { const nodeKeyMap = computed<Record<string, RenderedTreeExplorerNode>>(() => {
const map: Record<string, RenderedTreeExplorerNode> = {} const map: Record<string, RenderedTreeExplorerNode> = {}

View File

@@ -1,7 +1,6 @@
<template> <template>
<div <div
ref="container" ref="container"
data-tree-node
:class="[ :class="[
'tree-node', 'tree-node',
{ {