diff --git a/packages/components/scrollbar/src/scrollbar.vue b/packages/components/scrollbar/src/scrollbar.vue index 27dd76f225..7ed6ad710d 100644 --- a/packages/components/scrollbar/src/scrollbar.vue +++ b/packages/components/scrollbar/src/scrollbar.vue @@ -71,7 +71,6 @@ const distanceScrollState = { right: false, left: false, } -type distanceScrollStateKey = keyof typeof distanceScrollState const scrollbarRef = ref() const wrapRef = ref() @@ -101,31 +100,25 @@ const shouldSkipDirection = (direction: ScrollbarDirection) => { return distanceScrollState[direction] ?? false } +const DIRECTION_PAIRS: Record = { + top: 'bottom', + bottom: 'top', + left: 'right', + right: 'left', +} const updateTriggerStatus = (arrivedStates: Record) => { - const _updateTriggerState = (to: string, from: string) => { - const arrived = arrivedStates[to] - const oppositeArrived = arrivedStates[from] - const triggerKey = to as distanceScrollStateKey - const oppositeTriggerKey = from as distanceScrollStateKey - if (arrived && !distanceScrollState[triggerKey]) { - distanceScrollState[triggerKey] = true - } - if (!oppositeArrived && distanceScrollState[oppositeTriggerKey]) { - distanceScrollState[oppositeTriggerKey] = false - } + const oppositeDirection = DIRECTION_PAIRS[direction] + if (!oppositeDirection) return + + const arrived = arrivedStates[direction] + const oppositeArrived = arrivedStates[oppositeDirection] + + if (arrived && !distanceScrollState[direction]) { + distanceScrollState[direction] = true } - // scroll bottom to top - if (direction === 'top') { - _updateTriggerState('top', 'bottom') - } - if (direction === 'bottom') { - _updateTriggerState('bottom', 'top') - } - if (direction === 'left') { - _updateTriggerState('left', 'right') - } - if (direction === 'right') { - _updateTriggerState('right', 'left') + + if (!oppositeArrived && distanceScrollState[oppositeDirection]) { + distanceScrollState[oppositeDirection] = false } }