Tree 树形控件

示例

控制点击行为、展开收起

Item click

Expanded items

[ "infused", "brewed" ]
  • Infused
    • Brewed
      • Drip brewed
      • Filtered
      • Pour-over
      • Immersion brewed
    • French press
    • Cold brew
  • Boiled
  • Espresso
  • Milk coffee
<template>
<article>
  <section>
    <h4>Item click</h4>
    <veui-radio-group
      v-model="mode"
      :items="modes"
    />
  </section>
  <section>
    <h4>Expanded items</h4>
    {{ expanded }}
  </section>
  <section>
    <veui-tree
      :datasource="coffees"
      :item-click="mode"
      :expanded.sync="expanded"
    />
  </section>
</article>
</template>

<script>
import { RadioGroup, Tree } from 'veui'

export default {
  components: {
    'veui-radio-group': RadioGroup,
    'veui-tree': Tree
  },
  data () {
    return {
      modes: [
        { label: 'none', value: 'none' },
        { label: 'toggle', value: 'toggle' }
      ],
      mode: 'toggle',
      expanded: ['infused', 'brewed'],
      coffees: [
        {
          label: 'Infused',
          value: 'infused',
          children: [
            {
              label: 'Brewed',
              value: 'brewed',
              children: [
                {
                  label: 'Drip brewed',
                  value: 'drip-brewed'
                },
                {
                  label: 'Filtered',
                  value: 'filtered'
                },
                {
                  label: 'Pour-over',
                  value: 'pour-over'
                },
                {
                  label: 'Immersion brewed',
                  value: 'immersion-brewed'
                }
              ]
            },
            {
              label: 'French press',
              value: 'french-press'
            },
            {
              label: 'Cold brew',
              value: 'cold-brew'
            }
          ]
        },
        {
          label: 'Boiled',
          value: 'boiled',
          children: [
            {
              label: 'Percolated',
              value: 'percolated'
            },
            {
              label: 'Turkish',
              value: 'turkish'
            },
            {
              label: 'Moka',
              value: 'moka'
            }
          ]
        },
        {
          label: 'Espresso',
          value: 'espresso',
          children: [
            {
              label: 'Caffè Americano',
              value: 'caffe-americano'
            },
            {
              label: 'Cafe Lungo',
              value: 'cafe-lungo'
            },
            {
              label: 'Café Cubano',
              value: 'cafe-cubano'
            },
            {
              label: 'Caffè crema',
              value: 'caffe-crema'
            },
            {
              label: 'Cafe Zorro',
              value: 'cafe-zorro'
            },
            {
              label: 'Doppio',
              value: 'doppio'
            },
            {
              label: 'Espresso Romano',
              value: 'espresso-romano'
            },
            {
              label: 'Guillermo',
              value: 'guillermo'
            },
            {
              label: 'Ristretto',
              value: 'ristretto'
            }
          ]
        },
        {
          label: 'Milk coffee',
          value: 'milk-coffee',
          children: [
            {
              label: 'Flat white',
              value: 'flat-white'
            },
            {
              label: 'Latte',
              value: 'latte'
            },
            {
              label: 'Macchiato',
              value: 'macchiato'
            },
            {
              label: 'Cappuccino',
              value: 'cappuccino'
            },
            {
              label: 'White coffee',
              value: 'white-coffee'
            },
            {
              label: 'Flat white',
              value: 'flat-white'
            },
            {
              label: 'Flat white',
              value: 'flat-white'
            }
          ]
        }
      ]
    }
  }
}
</script>

自定义内容

Custom label

  • Infused
  • Boiled
  • Espresso
  • Milk coffee

Custom item

  • Infused
  • Boiled
  • Espresso
  • Milk coffee
<template>
<article>
  <section>
    <h4>Custom label</h4>
    <veui-tree
      :datasource="coffees"
      item-click="toggle"
    >
      <template
        slot="item-label"
        slot-scope="{ item }"
      >
        <i>{{ item.label }}</i>
      </template>
    </veui-tree>
  </section>
  <section>
    <h4>Custom item</h4>
    <veui-tree
      :datasource="coffees"
      item-click="toggle"
      class="custom-item"
    >
      <template
        slot="item"
        slot-scope="{ children, expanded, label }"
      >
        <veui-icon
          v-if="children && children.length"
          :name="expanded ? 'minus' : 'plus'"
        />
        {{ label }}
      </template>
    </veui-tree>
  </section>
</article>
</template>

<script>
import { Tree, Icon } from 'veui'
import 'veui-theme-one-icons/plus'
import 'veui-theme-one-icons/minus'

export default {
  components: {
    'veui-tree': Tree,
    'veui-icon': Icon
  },
  data () {
    return {
      coffees: [
        {
          label: 'Infused',
          value: 'infused',
          children: [
            {
              label: 'Brewed',
              value: 'brewed',
              children: [
                {
                  label: 'Drip brewed',
                  value: 'drip-brewed'
                },
                {
                  label: 'Filtered',
                  value: 'filtered'
                },
                {
                  label: 'Pour-over',
                  value: 'pour-over'
                },
                {
                  label: 'Immersion brewed',
                  value: 'immersion-brewed'
                }
              ]
            },
            {
              label: 'French press',
              value: 'french-press'
            },
            {
              label: 'Cold brew',
              value: 'cold-brew'
            }
          ]
        },
        {
          label: 'Boiled',
          value: 'boiled',
          children: [
            {
              label: 'Percolated',
              value: 'percolated'
            },
            {
              label: 'Turkish',
              value: 'turkish'
            },
            {
              label: 'Moka',
              value: 'moka'
            }
          ]
        },
        {
          label: 'Espresso',
          value: 'espresso',
          children: [
            {
              label: 'Caffè Americano',
              value: 'caffe-americano'
            },
            {
              label: 'Cafe Lungo',
              value: 'cafe-lungo'
            },
            {
              label: 'Café Cubano',
              value: 'cafe-cubano'
            },
            {
              label: 'Caffè crema',
              value: 'caffe-crema'
            },
            {
              label: 'Cafe Zorro',
              value: 'cafe-zorro'
            },
            {
              label: 'Doppio',
              value: 'doppio'
            },
            {
              label: 'Espresso Romano',
              value: 'espresso-romano'
            },
            {
              label: 'Guillermo',
              value: 'guillermo'
            },
            {
              label: 'Ristretto',
              value: 'ristretto'
            }
          ]
        },
        {
          label: 'Milk coffee',
          value: 'milk-coffee',
          children: [
            {
              label: 'Flat white',
              value: 'flat-white'
            },
            {
              label: 'Latte',
              value: 'latte'
            },
            {
              label: 'Macchiato',
              value: 'macchiato'
            },
            {
              label: 'Cappuccino',
              value: 'cappuccino'
            },
            {
              label: 'White coffee',
              value: 'white-coffee'
            },
            {
              label: 'Flat white',
              value: 'flat-white'
            },
            {
              label: 'Flat white',
              value: 'flat-white'
            }
          ]
        }
      ]
    }
  }
}
</script>

<style lang="less" scoped>
.custom-item {
  & /deep/ .veui-tree-item {
    position: relative;
    padding-left: 24px;
  }

  & /deep/ .veui-icon {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    left: 0;
  }
}
</style>

API

属性

名称类型默认值描述
datasourceArray<Object>[]

数据源数组,每个项目类型为 {label, value, children, ...}

名称类型描述
labelstring节点的文字描述。
valuestring节点对应的值。
childrenArray<Object>=节点的子节点数组,数组项类型同 datasource 数组项。
item-clickstring'none'

点击整个节点区域进行的操作类型。

名称描述
toggle触发子节点的展开/收起。
none无操作。
expandedArray[]

.sync

指定当前展开的节点,是一个对应于 datasource 中节点数据中 value 属性的数组。

插槽

名称描述
item

每个节点的整个内容区域。

名称类型描述
labelstring节点的文本描述。
valuestring节点的值。
childrenArray<Object>=节点的子节点数组,数组项类型同 datasource 数组项。
indexnumber当前数据节点在共父节点层级的索引。
depthnumber当前数据节点在树种的深度。

另外,datasource 内数据项中除了上面描述的字段之外的其它字段也会自动通过 v-bind 进行绑定到作用域参数上。

item-label每个节点的文本区域。作用域参数与 item 插槽一致。

事件

名称描述
click

点击节点触发,回调参数为 (item, parents, index, depth)

名称类型描述
itemObject节点数据。数组项类型与 datasource 项目相同。
parentsArray<Object>从根节点到当前节点父节点的路径。数组项类型与 datasource 项目相同。
indexnumber当前节点在自己所属层级的索引。
depthnumber当前节点在树形层级中的深度。
expand

节点展开时触发。回调参数为 (item, index, depth)

名称类型描述
itemObject节点数据。数组项类型与 datasource 项目相同。
indexnumber当前节点在自己所属层级的索引。
depthnumber当前节点在树形层级中的深度。
collapse

点击收起图标或者整个节点时触发,由 item-click 属性决定,回调参数为 (item, index, depth)

名称类型描述
itemObject节点数据。数组项类型与 datasource 项目相同。
indexnumber当前节点在自己所属层级的索引。
depthnumber当前节点在树形层级中的深度。

图标

名称描述
expand收起状态,点击后展开。
collapse展开状态,点击后收起。