2.0.0 • Published 5 years ago

vs-tree2.0 v2.0.0

Weekly downloads
2
License
MIT
Repository
-
Last release
5 years ago

vs-tree2.0

极简树组件, 无任何依赖【麻雀虽小,五脏俱全】

浏览器支持

EdgeChromeFirefoxOperaSafari
Latest ✔Latest ✔Latest ✔Latest ✔Latest ✔

功能点

  • 基础树组件
  • 层级面包屑
  • 复选框
  • 单选框
  • 异步加载数据
  • 虚拟列表
  • 拖拽节点
  • 手风琴
  • 树内搜索
  • 自定义图标
  • 连接线
  • 最大可选
  • 节点右键事件
  • 自定义格式化数据
  • 支持Vue组件

DEMO

跳转到DEMO

安装

npm install vs-tree

yarn add vs-tree

Options

InputDescTypeDefault
el选择器, 或 HTMLElementstring 或 HTMLElement
data展示数据Object、 Array
async延时渲染Booleanfalse
hideRoot是否展示根节点Booleanfalse
showLine是否展示连接线Booleanfalse
showIcon是否显示图标Booleanfalse
onlyShowLeafIcon是否仅显示叶子节点图标Booleanfalse
showCheckbox是否显示复选框Booleanfalse
showRadio是否显示单选框,会覆盖复选框Booleanfalse
radioParentoOnly每个父节点下唯一Booleanfalse
highlightCurrent是否高亮选中当前项Booleanfalse
accordion手风琴模式Booleanfalse
animation开启动画Booleanfalse
draggable开启拖拽Booleanfalse
dropable允许放置Booleanfalse
nocheckParent禁止父节点选中Booleanfalse
sort对选中列表排序Booleanfalse
checkOnClickNode是否在点击节点的时候选中节点Booleanfalse
lazy异步加载节点Booleanfalse
strictLeaf严格依赖isLeaf,不提供时如无子节点则不渲染展开图标Booleanfalse
max最大可选数量Number0
checkFilterLeaf选中结果过滤掉叶子节点, 异步加载时需手需提供 isLeafBooleanfalse
rootName根节点名称,仅 data 为数组时有效,此时不会默认Stringnull
expandClass展开收起图标classStringvs-expand-icon
theme皮肤风格,仅支持 'element'Stringnull
breadcrumb面包屑功能,只展示一层节点Objectnull
disabledKeys禁止操作Arraynull
checkedKeys默认选中Arraynull
expandKeys默认展开Arraynull
expandLevel默认展开级数, 0 不展开 -1 全部展开Number1
indent缩进Number10
showCount试图内显示节点数量Number20
itemHeight单个节点高度Number26

breadcrumb

optionsDesc默认
elSelector, HtmlElement内部创建根节点
iconstring, ELement, Functionnull
linkstring, ELement, Functionnull
separatorstring, ELement, Functionnull
changeEventdom,breadcrumbs,current

方法

Tree 内部使用了 Node 类型的对象来包装用户传入的数据,用来保存目前节点的状态。 Tree 拥有如下方法:

Methods说明参数
getCheckedNodes获取选中节点-
getNodeById根据 ID 获取 Node 节点id
setMaxValue设置最大可选number
scrollToIndex滚动到索引位置number
filter过滤节点keyword, onlySearchLeaf

onlySearchLeaf 只过滤叶子节点

Node 方法

Node 拥有如下方法:

Methods说明参数
setChecked设置是否选中true,false
setDisabled设置禁止操作true,false
remove删除当前节点-
append追加节点data

Events

事件名称说明回调参数返回值
click节点点击事件event, nodevoid
beforeCheck节点选择前触发nodetrue,false
check复选框被点击时触发event, nodevoid
change复选框改变时触发nodevoid
limitAlert超过 max 配置时触发-void
renderContent自定义节点内容h,nodeh()
loadlazy=true 时有效node, resolvevoid
checkFilter过滤掉的节点不计入统计nodetrue, false
format格式化数据data{name,children,isLeaf,icon}
contextmenu鼠标右键事件event, nodevoid
searchFilter搜索过滤keyword, node, datanode[]
searchRender搜索渲染node, cloneNodeElement
onDragstart开始拖拽e, nodevoid
onDragenter进入放置目标e, node, dragPosvoid
onDrop放置目标e, node, dragPosvoid

searchRender 返回的 Element 不会影响原有dom

renderContent

h: 生成简单 dom 节点,当前仅支持一下配置

renderContent: function (h, node) {
  return h("div", {
    className: "tree-action",
    children: [
      h("a", {
        text: 'append',
        click: function (e, node) {
          node.append({
            id: id++,
            name: 'append'
          })
        }
      }),
      h("a", {
        text: 'remove',
        click: function (e, node) {
          node.remove()
        }
      })
    ]
  })
}

load

resolve 异步加载完成后回调

lazy: true,
load: function (node, resolve) {
  setTimeout(() => {
    resolve([{
      id: id++,
      name: '新叶子节点' + id,
      isLeaf: true
    }])
  }, 1000)
}

format

目前仅支持,id, name、children、isLeaf、icon、extra

format: function(data) {
  return {
    name: data.title,
    children: data.child,
    isLeaf: !data.child,
    icon: 'custom-icon' || document.createElement
  }
}

Vue use

// main.js
import { install } from './assets/vs-tree/vs-tree'
import './assets/vs-tree/vs-tree.css'

Vue.use(install)
<template>
  <div id="app">
    <vs-tree :data="data"></vs-tree>
  </div>
</template>

<script>
var id = 1000
function add(parentId, name) {
  const list = []
  for (var i = 0; i < 10; i++) {
    list.push({ id: '100' + id++, name: name + i, parentId: parentId })
  }
  return list
}
const data = {
  id: '1', name: 'zhangsan', parentId: '-1', children: [
    { id: '100', name: 'wangwu', parentId: '1', children: add('100', 'wangwu') },
    { id: '101', name: 'zhaoliu', parentId: '1', children: add('101', 'zhaoliu') },
    { id: '102', name: 'huahua', parentId: '1' },
    { id: '103', name: 'oo-1', parentId: '1' },
    { id: '104', name: 'oo-2', parentId: '1' },
    { id: '105', name: 'oo-3', parentId: '1' },
    { id: '106', name: 'oo-4', parentId: '1' },
    { id: '107', name: 'oo-5', parentId: '1' },
    { id: '108', name: 'oo-6', parentId: '1' },
    { id: '109', name: 'oo-7', parentId: '1' },
    { id: '110', name: 'oo-8', parentId: '1' },
    { id: '111', name: 'oo-9', parentId: '1' },
  ]
}
export default {
  name: 'App',
  data () {
    return {
      data: data
    }
  },

}
</script>