1.0.0-development • Published 1 month ago

vue-sapling-tree v1.0.0-development

Weekly downloads
-
License
MIT
Repository
github
Last release
1 month ago

vue-sapling-tree

npm

alt text

English/中文

TODO

The document is not perfect.

Introduction

A modern, Vue 3 compatible tree component library, built with TypeScript, for building dynamic, interactive tree structures on your web applications. vue-sapling-tree is a complete rewrite of the original vue-jstree for Vue 2, updated to take advantage of Vue 3's Composition API and TypeScript for better type checking and developer experience.

Features

  • Fully compatible with Vue 3 and TypeScript.
  • Supports dynamic tree construction from JSON data.
  • Customizable nodes with checkboxes, icons, and drag-and-drop.
  • Supports asynchronous data loading for large datasets.
  • Highly customizable through slots and CSS.
  • Events for node clicks, toggles, drag-and-drop actions.
  • Easy integration into Vue 3 projects with a modern, reactive API.

DEMO

http://rwerplus.github.io/vue-sapling-tree

NPM

npm install vue-sapling-tree

ES6

import VSaplingTree from 'vue-sapling-tree'
new Vue({ components: { VSaplingTree } })

Setup

npm install npm run dev

Usage

    <v-sapling-tree v-model:treeData="data" show-checkbox multiple allow-batch whole-row @item-click="itemClick"></v-sapling-tree>

    new Vue({
      data: {
        data: [
          {
            "text": "Same but with checkboxes",
            "children": [
              {
                "text": "initially selected",
                "selected": true
              },
              {
                "text": "custom icon",
                "icon": "fa fa-warning icon-state-danger"
              },
              {
                "text": "initially open",
                "icon": "fa fa-folder icon-state-default",
                "opened": true,
                "children": [
                  {
                    "text": "Another node"
                  }
                ]
              },
              {
                "text": "custom icon",
                "icon": "fa fa-warning icon-state-warning"
              },
              {
                "text": "disabled node",
                "icon": "fa fa-check icon-state-success",
                "disabled": true
              }
            ]
          },
          {
            "text": "Same but with checkboxes",
            "opened": true,
            "children": [
              {
                "text": "initially selected",
                "selected": true
              },
              {
                "text": "custom icon",
                "icon": "fa fa-warning icon-state-danger"
              },
              {
                "text": "initially open",
                "icon": "fa fa-folder icon-state-default",
                "opened": true,
                "children": [
                  {
                    "text": "Another node"
                  }
                ]
              },
              {
                "text": "custom icon",
                "icon": "fa fa-warning icon-state-warning"
              },
              {
                "text": "disabled node",
                "icon": "fa fa-check icon-state-success",
                "disabled": true
              }
            ]
          },
          {
            "text": "And wholerow selection"
          }
        ]
      },
      methods: {
        itemClick (node) {
          console.log(node.model.text + ' clicked !')
        }
      }
    })

API

PropsTypeDefaultDescribe
treeDataArrayset tree data
sizeStringset tree item size , value : 'large' or '' or ''small'
show-checkboxBooleanfalseset it show checkbox
allow-transitionBooleantrueallow use transition animation
whole-rowBooleanfalseuse whole row state
no-dotsBooleanfalseshow or hide dots
collapseBooleanfalseset all tree item collapse state
multipleBooleanfalseset multiple selected tree item
allow-batchBooleanfalsein multiple choices. allow batch select
text-field-nameString'text'set tree item display field
value-field-nameString'value'set tree item value field
children-field-nameString'children'set tree item children field
item-eventsObject{}register any event to tree item, example
asyncFunctionasync load callback function , if node is a leaf ,you can set 'isLeaf: true' in data
loading-textString'Loading'set loading text
draggableBooleanfalseset tree item can be dragged , selective drag and drop can set 'dragDisabled: true' and 'dropDisabled: true' , all default value is 'false'
drag-over-background-colorString'#C9FDC9'set drag over background color
klassStringset append tree class

Methods in node.model

MethodParams
addChild(object) newDataItem
addAfter(object) newDataItem, (object) selectedNode
addBefore(object) newDataItem, (object) selectedNode
openChildren
closeChildren

Event

@item-click(node, item, e)

@item-toggle(node, item, e)

@item-drag-start(node, item, e)

@item-drag-end(node, item, e)

@item-drop-before(node, item, draggedItem, e)

@item-drop(node, item, draggedItem, e)

node : current node vue object

item : current node data item object

e : event

Data Item Optional Properties

NameTypeDefaultDescribe
iconStringcustom icon css class
openedBooleanfalseset leaf opened
selectedBooleanfalseset node selected
disabledBooleanfalseset node disabled
isLeafBooleanfalseif node is a leaf , set true can hide '+'
dragDisabledBooleanfalseselective drag
dropDisabledBooleanfalseselective drop

Custom Item Example

<v-sapling-tree v-model:treeData="data">
  <template scope="_">
    <div style="display: inherit; width: 200px" @click.ctrl="customItemClickWithCtrl">
      <i :class="_.vm.themeIconClasses" role="presentation" v-if="!_.model.loading"></i>
      {{_.model.text}}
      <button style="border: 0px; background-color: transparent; cursor: pointer;" @click="customItemClick(_.vm, _.model, $event)"><i class="fa fa-remove"></i></button>
    </div>
  </template>
</v-sapling-tree>

more elegant:

<v-sapling-tree v-model:treeData="data">
  <template scope="_">
    <div style="display: inherit; width: 200px" @click.ctrl="customItemClickWithCtrl" @click.exact="customItemClick(_.vm, _.model, $event)">
    <i :class="_.vm.themeIconClasses" role="presentation" v-if="!_.model.loading"></i>
    {{_.model.text}}
    </div>
  </template>
</v-sapling-tree>

License

Licensed under the MIT license.

Thanks For jstree's repository

Thanks For jstree's UI