Vue自身並沒有實現樹形下拉框的組件,找了很多資料,最后在Github上找了個插件vue-treeselect,功能還是比較全的,模糊搜索、多選、延遲加載、異步搜索、排序,自定義、Vuex支持等等。這些功能在官網上都有詳細的介紹:
vue-treeselect官網: vue-treeselect
vue-treeselect github地址: vue-treeselect
下面只做個簡單的功能介紹,模糊搜索與樹形結構展示:
當然,首先是下載安裝插件:
npm install --save @riophae/vue-treeselect
安裝成功之后,就可以進行測試了,下面是我的測試vue:
<template>
<div>
<Card>
<tree-select
:options="options"
placeholder="請選擇分類..."
v-model="value"
/>
</Card>
<Card>
{{ value }}
</Card>
</div>
</template>
<script>
import { mapActions } from 'vuex'
import TreeSelect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: 'CustomTreeSelect',
components: { TreeSelect },
data() {
return {
value: 0,
options: [],
}
},
methods: {
...mapActions([
'albumCategoryList'
]),
queryCategoryList () {
this.albumCategoryList({
parentId: 0,
all: 1
}).then((res) => {
console.log(res.fields)
if (res.status === 1) {
let result = []
const children = this.getTree(res.fields)
let obj = {}
obj.label = '頂級分類'
obj.id = 0
obj.children = children
result.push(obj)
this.options = result
} else {
this.$Notice.error({
title: '錯誤',
desc: res.msg
})
}
}).catch(error => {
this.$Notice.error({
title: '錯誤',
desc: '網絡連接錯誤'
})
console.log(error)
})
},
getTree (tree = []) {
let arr = [];
if (tree.length !== 0) {
tree.forEach(item => {
let obj = {};
obj.label = item.categoryName;
obj.id = item.id;
if(item.child === 1) {
obj.children = this.getTree(item.children);
}
arr.push(obj);
});
}
return arr
},
},
mounted () {
this.queryCategoryList()
}
}
</script>
<style scoped>
</style>
這個插件默認的數據結構為:
{ "id" : "", "label" : "", "children" : [] }
我們從數據庫查出來的數據肯定不是這個樣子的啦,所以需要在頁面中轉換一下數據結構,這個邏輯看一下代碼中的函數 getTree()。在提醒一下,如果當前分類下面沒有子分類的話,就不需要children這個屬性了。
上述運行成功之后,在界面上就可以看到具體的結構了:
默認情況是這樣的:

展開之后是這樣的:

模糊搜索之后是這樣的:

選中某個分類之后,與之綁定的data屬性就會得到分類的id值:

這樣一個簡單的下拉樹結構就出來了,更復雜的功能可以參考官網來寫,其中例子都很全面
