children
: [
{
nav_id
:
11
,
nav_name
:
'11'
,
key
:
11
},
{
nav_id
:
12
,
nav_name
:
'12'
,
key
:
12
}]
nav_id
:
2
,
key
:
2
,
nav_name
:
'分组二'
,
children
: [
{
nav_id
:
21
,
nav_name
:
'21'
,
key
:
21
},
{
nav_id
:
22
,
nav_name
:
'22'
,
key
:
22
}
id
:
3
,
nav_name
:
'分组三'
,
key
:
3
,
children
: [
{
nav_id
:
31
,
nav_name
:
'31'
,
key
:
31
},
{
nav_id
:
32
,
nav_name
:
'32'
,
key
:
32
},
{
nav_id
:
33
,
nav_name
:
'33'
,
key
:
33
},
{
nav_id
:
34
,
nav_name
:
'34'
,
key
:
34
}
其渲染结果如下
在antd官网的Tree型组件拖动的示例中,提供了一个onDrop方法,用来实现拖拽功能,onDrop方法的参数是一个info对象,如下是官网示例中的一段。定义了四个变量,下面对这四个变量进行详细的说明
const dropKey = info.node.key;
const dragKey = info.dragNode.key;
const dropPos = info.node.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
info对象
info对象是onDrop方法的参数,主要提供了拖拽的相关信息
info.node是落下的节点信息
info.dragNode是拖拽的节点信息
info.dropPosition是落下的位置信息
dropKey
dropKey是拖拽后所落在的节点key,选取放置位置的上一个元素(同级或上级),当最顶的时候是下一个元素
将节点31拖到节点32下边(平级或下级),那么dropKey就是32
将节点32拖到31上边,它会判定dropKey为3,因为31上边没有平级元素,所以找到了父级元素3
将节点3拖到节点1前边,dropKey为1,节点1上边没有父级和平级(最顶),所以取下边的元素
dragKey
拖拽的节点key,拖动哪个节点,dragKey就是那个节点的key
dropPos
dropPos是通过info.node.pos转换而来的
const dropPos = info.node.pos.split('-')
pos这个是tree生成的属性,用来标识节点的所在层级
例如节点31, 用{pos:"0-2-0"}表示,第一个0可以看成是默认的,2-0,分别表示每个层级的下标
最后一个0,表示叶子节点(最后一级)的下标
dropPosition
dropPosition也是由其他变量转换而来
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]);
我们用index来表示叶子节点的下标,即
const index = Number(dropPos[dropPos.length - 1])
我们先来看看info.dropPosition的生成逻辑,info.dropPosition会根据dropKey的index算出不同的值,平级在下为index+1,平级在上为index-1,子级为index
如果我们将节点34拖到31下面,那么dropKey是31,index是0,平级在下展示,info.dropPosition=index+1=1;
如果我们将节点34拖到31上面,此时的dropKey会是3(详见dropKey的生成规则),index=2,相当于变成了3的子级,info.dropPosition=index=2;
如果我们将节点34拖到33上面,此时的dropKey会是32(详见dropKey的生成规则),index=1,平级在上展示,info.dropPosition=index-1=0
如果我们将节点3拖到1上面,1是最顶的元素,那么dropKey是1,index=0,平级在上显示,info.dropPosition=index-1=-1
所以dropPosition这个变量其实是在计算拖拽后节点与dropKey的位置关系( 即info.dropPosition-index)
dropPosition = -1,是移动到和dropKey的平级,并在其上面(即info.dropPosition比dropKey的下标小一个)。
dropPosition = 1,是移动到和dropKey的平级,并在其下面(info.dropPosition比dropKey的下标大一个)。
dropPosition = 0,是移动到dropKey下面作为他的子级(info.dropPosition和dropKey的下标同样大)。
金色曼陀罗
粉丝