# TreeField 树选择

树型数据选择组件,可用于省市区、分类选择等。

# 属性

# value/v-model

  • 类型:{Array}
  • 说明:表单值
  • 默认值:[]

# placeholder

  • 类型:{String}
  • 说明:占位文字
  • 默认值:'请选择'

# items

  • 类型:{Array}
  • 说明:父子 id 关系的待选项
  • 默认值:[]

TIP

当设置了 lazy-load 时,此属性将被忽略

# keys

  • 类型:{Object}
  • 说明:配置选项数据的属性名
  • 默认值:见下方
{
  label: 'name', // 标签名
  value: 'id', // 标签值
  parentValue: 'parentId', // 父标签值,lazyLoad 的数据无需配置
  disabled: 'disabled' // 是否禁止选择
}

# disabled

  • 类型:{Boolean}
  • 说明:是否禁用
  • 默认值:false

# free-checked

  • 类型:{Boolean}
  • 说明:是否允许自由选择层级
  • 默认值:true

# lazy-load

  • 类型:{Function}
  • 说明:动态加载数据的方法
  • 默认值:null
  • 回调参数:
    • {Object} node 点击的选项数据
    • {Function} resolve 数据加载完成的回调

WARNING

resolve 必须调用,参数为子选项列表数据

# show-all-levels

  • 类型:{Boolean}
  • 说明:是否显示选中标签名称的完整路径
  • 默认值:false

# separator

  • 类型:{String}
  • 说明:选项分隔符
  • 默认值:'/'

TIP

show-all-levels 为 true 时,此属性才起作用

# tick-color

  • 类型:{String}
  • 说明:标签的主题色
  • 默认值:#DC2E1F

# 事件

# confirm

  • 说明:点击确定时
  • 回调参数:{Array} value 选中值的集合

# cancel

  • 说明:点击取消时
  • 回调参数:

# 插槽

# default

  • 说明:默认插槽为 Field 组件,可通过 slot-scope 注入标签显示名
  • 示例:
<tree-field>
  <template slot-scope="{ valueShow }">
    <van-cell :title="valueShow">
  </template>
</tree-field>

# 示例

<template>
  <div>
    <tree-field
      v-model="ids"
      :lazy-load="lazyLoad"
      label="异步加载"
      :keys="{ label: 'label', value: 'value' }"
    />
    <tree-field
      v-model="ids2"
      :items="items"
      label="同步加载"
      :keys="{ label: 'name', value: 'id', parentValue: 'pid' }"
    />
  </div>
</template>

<script>
  import { TreeField } from '@fe/packages/components'

  export default {
    name: 'TreeFieldExample',
    components: {
      TreeField
    },
    data() {
      return {
        ids: [],
        lazyLoad(node, resolve) {
          setTimeout(() => {
            const n = 8
            const a = []
            for (let index = 0; index < n; index++) {
              const id = ((node && node.value) || '') + index
              a.push({ value: id, label: '节点' + id })
            }
            resolve(node && node.value.length >= 4 ? [] : a)
          }, 100)
        },

        ids2: [],
        items: [
          { id: 'yizhi', pid: 'shejiyuanze', name: '一致' },
          { id: 'fankui', pid: 'shejiyuanze', name: '反馈' },
          { id: 'xiaolv', pid: 'shejiyuanze', name: '效率' },
          { id: 'kekong', pid: 'shejiyuanze', name: '可控' },
          { id: 'shejiyuanze', pid: 'zhinan', name: '设计原则' },
          { id: 'cexiangdaohang', pid: 'daohang', name: '侧向导航' },
          { id: 'dingbudaohang', pid: 'daohang', name: '顶部导航' },
          { id: 'daohang', pid: 'zhinan', name: '导航' },
          { id: 'zhinan', name: '指南' },
          { id: 'layout', pid: 'basic', name: 'Layout 布局' },
          { id: 'basic', pid: 'zujian', name: 'Basic' },
          { id: 'radio', pid: 'form', name: 'Radio 单选框' },
          { id: 'checkbox', pid: 'form', name: 'Checkbox 多选框' },
          { id: 'input', pid: 'form', name: 'Input 输入框' },
          { id: 'input-number', pid: 'form', name: 'InputNumber 计数器' },
          { id: 'form', pid: 'zujian', name: 'Form' },
          { id: 'table', pid: 'data', name: 'Table 表格' },
          { id: 'tag', pid: 'data', name: 'Tag 标签' },
          { id: 'data', pid: 'zujian', name: 'Data' },
          { id: 'alert', pid: 'notice', name: 'Alert 警告' },
          { id: 'notice', pid: 'zujian', name: 'Notice' },
          { id: 'menu', pid: 'navigation', name: 'NavMenu 导航菜单' },
          { id: 'tabs', pid: 'navigation', name: 'Tabs 标签页' },
          { id: 'navigation', pid: 'zujian', name: 'Navigation' },
          { id: 'dialog', pid: 'others', name: 'Dialog 对话框' },
          { id: 'tooltip', pid: 'others', name: 'Tooltip 文字提示' },
          { id: 'others', pid: 'zujian', name: 'Others' },
          { id: 'zujian', name: '组件' },
          { id: 'axure', pid: 'ziyuan', name: 'Axure Components' },
          { id: 'sketch', pid: 'ziyuan', name: 'Sketch Templates' },
          { id: 'jiaohu', pid: 'ziyuan', name: '组件交互文档' },
          { id: 'ziyuan', name: '资源' }
        ]
      }
    }
  }
</script>