@@ -14,7 +14,6 @@ import {
1414 findAncestorWithClass ,
1515 getPrevSibling ,
1616 getNextSibling ,
17- getDragoverPlacement ,
1817} from './utils' ;
1918
2019export const useDrag = ( {
@@ -92,9 +91,8 @@ export const useDrag = ({
9291 let scrollElementRect : DOMRect | undefined = undefined ;
9392 let clientElementRect : DOMRect | undefined = undefined ;
9493
95- const [ topPlacement , bottomPlacement ] = getDragoverPlacement (
96- props . dragoverPlacement ,
97- ) ;
94+ let topPlacement = 0.33 ;
95+ let bottomPlacement = 0.66 ;
9896
9997 const dragBox = document . createElement ( 'div' ) ;
10098 dragBox . classList . add ( 'virt-tree-drag-box' ) ;
@@ -253,28 +251,11 @@ export const useDrag = ({
253251 const hoverElement = document . elementFromPoint ( mouseX , mouseY ) ;
254252 if ( ! hoverElement ) return ;
255253 hoverTreeItem = findAncestorWithClass ( hoverElement , 'virt-tree-item' ) ;
256- if ( ! hoverTreeItem ) {
257- return ;
258- }
259-
254+ if ( ! hoverTreeItem ) return ;
260255 const hoverTreeId = hoverTreeItem ?. dataset ?. id ;
261256 if ( ! hoverTreeId ) return ;
262257 const hoverTreeNode = getTreeNode ( hoverTreeId ) ;
263258 if ( ! hoverTreeNode ) return ;
264-
265- // 操作元素和hover元素不能一致
266- if ( hoverTreeItem === sourceTreeItem ) {
267- // 移除 line
268- if ( hasStyleTreeItem ?. contains ( dragLine ) ) {
269- hasStyleTreeItem ?. removeChild ( dragLine ) ;
270- }
271- // 移除 box
272- if ( hasStyleTreeItem ?. contains ( dragBox ) ) {
273- hasStyleTreeItem ?. removeChild ( dragBox ) ;
274- }
275- dragEffect = false ;
276- return ;
277- }
278259 const hoverTreeItemRect = hoverTreeItem ?. getBoundingClientRect ( ) ;
279260 if ( ! hoverTreeItemRect ) return ;
280261
@@ -285,6 +266,15 @@ export const useDrag = ({
285266 // 计算鼠标相对于元素高度的比例
286267 const positionRatio = relativeY / elementHeight ;
287268
269+ if ( hoverTreeNode . data . disableDragIn ) {
270+ // 如果禁止拖入,就不需要中间区域判断了
271+ topPlacement = 0.5 ;
272+ bottomPlacement = 0.5 ;
273+ } else {
274+ topPlacement = 0.33 ;
275+ bottomPlacement = 0.66 ;
276+ }
277+
288278 if ( positionRatio < topPlacement ) {
289279 placement = 'top' ;
290280 } else if ( positionRatio > bottomPlacement ) {
@@ -312,6 +302,20 @@ export const useDrag = ({
312302 lastPlacement = placement ;
313303 lastHoverTreeItem = hoverTreeItem ;
314304
305+ // 操作元素和hover元素不能一致
306+ if ( hoverTreeItem === sourceTreeItem ) {
307+ // 移除 line
308+ if ( hasStyleTreeItem ?. contains ( dragLine ) ) {
309+ hasStyleTreeItem ?. removeChild ( dragLine ) ;
310+ }
311+ // 移除 box
312+ if ( hasStyleTreeItem ?. contains ( dragBox ) ) {
313+ hasStyleTreeItem ?. removeChild ( dragBox ) ;
314+ }
315+ dragEffect = false ;
316+ return ;
317+ }
318+
315319 // 一旦发生变化立马清除定时器
316320 if ( hoverExpandTimer ) {
317321 clearTimeout ( hoverExpandTimer ) ;
@@ -322,11 +326,7 @@ export const useDrag = ({
322326 dragEffect = false ;
323327 // console.log('鼠标在中部', dragEffect);
324328 // 判断是否能够进入disableDragIn
325- const id = hoverTreeItem ?. dataset ?. id ;
326- if ( ! id ) return ;
327- const node = getTreeNode ( id ) ;
328- if ( ! node ) return ;
329- parentNode = node ;
329+ parentNode = hoverTreeNode ;
330330 prevNode = undefined ;
331331 if ( hasStyleTreeItem ?. contains ( dragLine ) ) {
332332 hasStyleTreeItem ?. removeChild ( dragLine ) ;
@@ -345,7 +345,7 @@ export const useDrag = ({
345345 // }
346346
347347 // 被禁用
348- if ( node . data ?. disableDragIn ) return ;
348+ if ( hoverTreeNode . data ?. disableDragIn ) return ;
349349
350350 // 添加 box
351351 hoverTreeItem ?. appendChild ( dragBox ) ;
@@ -358,11 +358,11 @@ export const useDrag = ({
358358 clearTimeout ( hoverExpandTimer ) ;
359359 hoverExpandTimer = null ;
360360 }
361- const isExpanded = hasExpanded ( node ) ;
361+ const isExpanded = hasExpanded ( hoverTreeNode ) ;
362362 if ( ! isExpanded ) {
363363 if ( ! hoverExpandTimer ) {
364364 hoverExpandTimer = setTimeout ( ( ) => {
365- expandNode ( id , true ) ;
365+ expandNode ( hoverTreeId , true ) ;
366366 if ( hoverExpandTimer ) {
367367 clearTimeout ( hoverExpandTimer ) ;
368368 hoverExpandTimer = null ;
0 commit comments