You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

104 lines
2.5 KiB

// pages/common/comTree/index.js
/**
value = [
{
id: 1,
name: '一级名称',
children: []
}
]
*/
Component({
/**
* 组件的属性列表
*/
properties: {
dataTree: {
type: Array,
value: []
},
selectKey: { // 选中的节点id
type: String,
value: ''
},
isSelectLastNode: { //是否必须选中最后一节点
type: Boolean,
value: false
},
isOpenAll: { //是否展开全部节点
type: Boolean,
value: false
}
},
observers: {
'dataTree': function(params) {
let dataTree = JSON.parse(JSON.stringify(this.properties.dataTree))
var tree = this.findParent(dataTree,this.properties.selectKey,[])
params.forEach(v => {
if(v.id == tree[0]){
v.open = true
}else{
v.open = this.properties.isOpenAll // 是否展开
}
})
this.setData({
tree:params
})
}
},
/**
* 组件的初始数据
*/
data: {
tree: []
},
/**
* 组件的方法列表
*/
methods: {
findParent(data, target, result) {
for (let i in data) {
let item = data[i]
if (item.id == target) {
//将查找到的目标数据加入结果数组中
//可根据需求unshift(item.id)或unshift(item)
item.open = true
result.unshift(item.id)
return result
}
if (item.children && item.children.length > 0) {
let ok = this.findParent(item.children, target, result)
if (ok) {
item.open = true
result.unshift(item.id)
return result
}
}
}
//走到这说明没找到目标
return false
},
isOpen(e) {
const open = 'tree[' + e.currentTarget.dataset.index + '].open'
this.setData({
[open]: !this.data.tree[e.currentTarget.dataset.index].open
})
},
select(e) {
const item = e.currentTarget.dataset.item
if(this.properties.isSelectLastNode) {
// console.log(item)
this.triggerEvent('select', { item: item }, { bubbles: true, composed: true })
// if (!item.children || item.children.length == 0) {
// this.triggerEvent('select', { item: item }, { bubbles: true, composed: true })
// } else {
// this.triggerEvent('select', { tips: '必须选择最后一个节点' }, { bubbles: true, composed: true })
// }
} else {
this.triggerEvent('select', { item: item }, { bubbles: true, composed: true })
}
}
}
})