vue-treeselect 是一个多选组件,具有对 Vue.js嵌套选项支持
需要Vue 2.2+
具体样式展示:

npm install --save @riophae/vue-treeselect
- import treeSelect from "@riophae/vue-treeselect";
- import "@riophae/vue-treeselect/dist/vue-treeselect.css";
- components: {
- treeSelect
- },
- <treeSelect v-model="value"
- :options="options"
- :show-count="true"
- :normalizer="normalizer"
- placeholder="please select……" />
- data() {
- return {
- // define the default value
- value: null,
- // define options
- options: [{
- id: 'a',
- label: 'a',
- children: [{
- id: 'aa',
- label: 'aa'
- }, {
- id: 'ab',
- label: 'ab'
- }],
- }, {
- id: 'b',
- label: 'b'
- }, {
- id: 'c',
- label: 'c'
- }]
- },
- normalizer(node) {
- if (node.children && !node.children.length) {
- delete node.children;
- }
- return {
- id: node.id, //自定义id
- label: node.label, //自定义label
- children: node.children && node.children.length > 0 ? node.children: 0 //处理children,当children为[]或null时,子节点会展示No sub-options,一般子节点不需要展示这个,所以这样处理
- };
- }
- }
- }
解决方法:增加normalizer属性,将id和label字段转换,比如部门接口返的数据是deptId和deptName,需要做如下处理
- normalizer(node) {
- if (node.children && !node.children.length) {
- delete node.children;
- }
- return {
- id: node.deptId, //自定义id
- label: node.deptName, //自定义label
- }
- }
原因分析:是由于children为[ ]或null 造成的
解决方法:children为[ ]或null时,将children删除,可以自己写方法遍历删除,也可以在normalizer中处理。以下是最简单的处理方法:
- normalizer(node) {
- if (node.children && !node.children.length) {
- delete node.children;
- }
- return {
- id: node.id, //自定义id
- label: node.label, //自定义label
- //处理children,当children为[]或null时,子节点会展示No sub-options,一般子节点不需要展示这个,所以将children置为0
- children: node.children && node.children.length > 0 ? node.children: 0
- };
- }
- }