這幾天接到一個需求,里面有需要做一個屬性組件,找的第三方的,但是不能完全滿足我的需求,有這時間,我就自己做個小輪子吧。
先看效果圖(紅點之前用的字體圖標,是個對號,這里為了方便,用圓圈代替了選中狀態,所以不是太好看,需要的自行修改就好)
我直接用的vue-cli搭建的項目,代碼目錄如下:
使用方式如下:
treeData的格式如下:
treeData: [ {open: false, name: '1', level: 0, checked: true}, { open: false, // opend 是否展開子集 name: '2', level: 0, //level代表第幾層 checked: false, // checked 代表是否選中狀態 children: [ { open: false, name: '3', level: 1, checked: false, children: [ {open: false, name: '4', level: 2, checked: false}, { open: false, name: '5', level: 2, checked: false } ] } ] } ],
這個組件設計到幾個關鍵點如下:
1. 深度watch
由於數據是個深層的對象,所以單純的watch,檢測不到數據的變化,所以使用deep,代碼如下:
watch: {
// 深度監聽 treeDate的數據變化 用 deep
treeData: {
handler: function (newVal, oldVal) {
this.calculateSelectFormResult()
},
deep: true
}
}
2.遞歸
數據的結果是用遞歸遍歷出來的,
calculateSelectFormResult: function () {
var arr = []
function f (obj) {
for (var i in obj) {
if (obj[i].checked) {
// console.log(2)
arr.push(obj[i].name)
}
if (obj[i].children) {
if (obj[i].children.length !== 0) {
f(obj[i].children)
}
}
}
}
f(this.treeData)
this.selectFormResult = arr
console.log(this.selectFormResult)
}
3.模擬slideDown slideUp動畫效果
項目完整代碼地址: https://github.com/YalongYan/tree