UNPKG

nutui-uniapp

Version:

京东风格的轻量级移动端 Uniapp、Vue3 组件库(支持小程序开发)

74 lines (57 loc) 1.9 kB
import { eachTree, formatTree } from './helper' import type { CascaderConfig, CascaderOption, CascaderValue } from './types' class Tree { nodes: CascaderOption[] readonly config: CascaderConfig constructor(nodes: CascaderOption[], config?: CascaderConfig) { this.config = { value: 'value', text: 'text', children: 'children', ...(config || {}), } this.nodes = formatTree(nodes, null, this.config) } updateChildren(nodes: CascaderOption[], parent: CascaderOption | null): void { if (!parent) this.nodes = formatTree(nodes, null, this.config) else parent.children = formatTree(nodes, parent, this.config) } // for test getNodeByValue(value: CascaderOption['value']): CascaderOption | void { let foundNode eachTree(this.nodes, (node: CascaderOption) => { if (node.value === value) { foundNode = node return true } }) return foundNode } getPathNodesByValue(value: CascaderValue): CascaderOption[] { if (!value.length) return [] const pathNodes = [] let currentNodes: CascaderOption[] | void = this.nodes while (currentNodes && currentNodes.length) { const foundNode: CascaderOption | void = currentNodes.find(node => node.value === value[node.level as number]) if (!foundNode) break pathNodes.push(foundNode) currentNodes = foundNode.children } return pathNodes } isLeaf(node: CascaderOption, lazy: boolean): boolean { const { leaf, children } = node const hasChildren = Array.isArray(children) && Boolean(children.length) return leaf == null ? !hasChildren && !lazy : leaf } hasChildren(node: CascaderOption, lazy: boolean): boolean { if (lazy) return Array.isArray(node.children) && Boolean(node.children.length) return !this.isLeaf(node, lazy) } } export default Tree