big-ee-ui
Version:
基于element-ui二次封装的UI库
81 lines (71 loc) • 2.15 kB
JavaScript
import Node from './node'
import { coerceTruthyValueToArray, valueEquals } from 'element-ui/src/utils/util'
const flatNodes = (data, leafOnly) => {
return data.reduce((res, node) => {
if (node.isLeaf) {
res.push(node)
} else {
!leafOnly && res.push(node)
res = res.concat(flatNodes(node.children, leafOnly))
}
return res
}, [])
}
const flatNodesRewrite = data => {
let leafNodes = []
let flattedNodes = []
const flatItem = arr => {
arr.forEach(node => {
if (node.isLeaf || !node.children || !node.children.length) {
leafNodes.push(node)
flattedNodes.push(node)
} else {
flattedNodes.push(node)
flatItem(node.children)
}
})
}
flatItem(data)
return {
leafNodes,
flattedNodes
}
}
export default class Store {
constructor(data, config) {
this.config = config
this.initNodes(data)
}
initNodes(data) {
data = coerceTruthyValueToArray(data)
this.nodes = data.map(nodeData => new Node(nodeData, this.config))
const { flattedNodes, leafNodes } = flatNodesRewrite(this.nodes)
this.flattedNodes = flattedNodes
this.leafNodes = leafNodes
}
appendNode(nodeData, parentNode) {
const node = new Node(nodeData, this.config, parentNode)
const children = parentNode ? parentNode.children : this.nodes
children.push(node)
}
appendNodes(nodeDataList, parentNode) {
nodeDataList = coerceTruthyValueToArray(nodeDataList)
nodeDataList.forEach(nodeData => this.appendNode(nodeData, parentNode))
}
getNodes() {
return this.nodes
}
getFlattedNodes(leafOnly, cached = true) {
const cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes
return cached ? cachedNodes : flatNodes(this.nodes, leafOnly)
}
getNodeByValue(value) {
if (value) {
const nodes = this.getFlattedNodes(false, !this.config.lazy).filter(
node => valueEquals(node.path, value) || node.value === value
)
return nodes && nodes.length ? nodes[0] : null
}
return null
}
}