# 常见场景汇总 ## 格式化数据方法 1. `BI.Tree.transformToTreeFormat(nodes)` 将id,pId结构的列表形式转化为id,children形式的类树结构 2. `BI.Tree.transformToArrayFormat(nodes,pId)` 将id,children形式的类树结构转化为id,pId结构的列表形式 3. `BI.Tree.traversal(nodes,callback)` 递归遍历id,children形式的树结构,深度优先 ## layer层级的判断方法 通常我们用`layer`属性标明当前节点的层级(第一层为0),对于异步加载的树,我们可以在`itemsCreator`回掉的参数中获取当前父节点的详细信息,子节点的`layer`增加1级即可 对于非异步的完整的节点数据,可以采用递归的方式 ```javascript traversalLayers: function (items, layer) { var self = this; BI.each(items, function (index, item) { item.layer = layer; if (item.children) { self.traversalLayers(item.children, layer + 1) } }) } ``` 利用`BI.Tree.traversal(nodes,callback)`会更方便(2020-09版本可用) ```javascript traversalLayers: function (items) { BI.Tree.traversal(items, function (index, node, pNode) { node.layer = pNode ? pNode.layer + 1 : 0 }); return items } ``` ## 多层级性能优化 对于`bi.button_tree`的默认单选逻辑来说,多层级+多节点会出现指数级性能隐患,因此适用于数据量比较小的场景,如果针对部门职务树等超大数据场景,建议采用外部控制选中状态的方式 首先`bi.custom_tree`的props中el属性里面嵌套的`bi.button_tree`的`chooseType`要置为-1,即不控制任何选中逻辑. 而后对`bi.custom_tree`添加事件监听,调用`setValue`由外部赋值 ```javascript listeners: [ { eventName: BI.Controller.EVENT_CHANGE, action: function (type, value) { if (type === BI.Events.CLICK) { this.setValue(value); } }, }, ], ```