[TOC]
ps:如果有此类需求,建议用别的方式解决,此方法存在一些问题,而且体验不好。可以考虑接口做数据缓存同步等。
基于Element v2.4.5。
省市区三级数据动态加载,多选,支持回显。
每一项的数据格式:
{
disName: "广东省"
disCode: 101002001000000000
}
下面的文件无法直接运行,只提供思路。
保存时的数据格式: [[省disCode, 市disCode, 区disCode],[省disCode, 市disCode, 区disCode]]
回显时的数据格式同保存时的格式。
回显思路:
- 根据选中的值获取与值相关的所有选项
- 将选项设置到nodes中,即cascade中保存选项的数组中(parentNode.appendNodes())
- 设置选中状态(currentNode.doCheck())
- 设置输入框中显示的值(cascadeRef.computePresentContent())
代码逻辑:
- 加载组件时,默认调用getAreaData获取省的数据
- 调用initAreaData,如果是编辑,即value有值,继续下面的步骤
- 调用queryAreaListByDisCode,获取选择的disCode的所有下级数据
- 遍历回显的值value,如果是最后一级,则是叶子节点,childIsLeaf = true,如果是倒数第二级,则此项的children为叶子节点,leaf = true
- 调用handleDisCode,如果是叶子节点,找到currentNode,执行doCheck方法,处理页面上的选中状态;如果是倒数第二级,给数据加上 leaf: true, 表明children是叶子节点。执行appendNodes,将数据插入到disCode对应的节点(即parentNode)的children中,并将parentNode的loaded设置为true,防止点击节点时再次加载
- 数据都插入完成后,cascade组件的store中,nodes即保存了节点之间的关系
- 调用cascade的computePresentContent方法,获取选中的值,设置到输入框中
```vuecascade的store中的nodes格式: [Node,Node,Node] Node: { value: disCode, label: disName, data: { disCode: '', disName: '', leaf?: true, // leaf为true表明为叶子节点 }, children: [Node, Node] }
```