• Stars
    star
    654
  • Rank 68,870 (Top 2 %)
  • Language Vue
  • License
    MIT License
  • Created over 7 years ago
  • Updated almost 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🌲A vue component for tree structure

Actions Status

vue-tree-list

A vue component for tree structure. Support adding treenode/leafnode, editing node's name and dragging.

vue-tree-demo.gif

Live Demo

install

Install the plugin then you can use the component globally.

import Vue from 'vue'
import VueTreeList from 'vue-tree-list'

Vue.use(VueTreeList)

Or just register locally like the example below.

use

npm install vue-tree-list

<template>
  <div>
    <button @click="addNode">Add Node</button>
    <vue-tree-list
      @click="onClick"
      @change-name="onChangeName"
      @delete-node="onDel"
      @add-node="onAddNode"
      :model="data"
      default-tree-node-name="new node"
      default-leaf-node-name="new leaf"
      v-bind:default-expanded="false"
    >
      <template v-slot:leafNameDisplay="slotProps">
        <span>
          {{ slotProps.model.name }} <span class="muted">#{{ slotProps.model.id }}</span>
        </span>
      </template>
      <span class="icon" slot="addTreeNodeIcon">📂</span>
      <span class="icon" slot="addLeafNodeIcon"></span>
      <span class="icon" slot="editNodeIcon">📃</span>
      <span class="icon" slot="delNodeIcon">✂️</span>
      <span class="icon" slot="leafNodeIcon">🍃</span>
      <span class="icon" slot="treeNodeIcon">🌲</span>
    </vue-tree-list>
    <button @click="getNewTree">Get new tree</button>
    <pre>
      {{newTree}}
    </pre>
  </div>
</template>

<script>
  import { VueTreeList, Tree, TreeNode } from 'vue-tree-list'
  export default {
    components: {
      VueTreeList
    },
    data() {
      return {
        newTree: {},
        data: new Tree([
          {
            name: 'Node 1',
            id: 1,
            pid: 0,
            dragDisabled: true,
            addTreeNodeDisabled: true,
            addLeafNodeDisabled: true,
            editNodeDisabled: true,
            delNodeDisabled: true,
            children: [
              {
                name: 'Node 1-2',
                id: 2,
                isLeaf: true,
                pid: 1
              }
            ]
          },
          {
            name: 'Node 2',
            id: 3,
            pid: 0,
            disabled: true
          },
          {
            name: 'Node 3',
            id: 4,
            pid: 0
          }
        ])
      }
    },
    methods: {
      onDel(node) {
        console.log(node)
        node.remove()
      },

      onChangeName(params) {
        console.log(params)
      },

      onAddNode(params) {
        console.log(params)
      },

      onClick(params) {
        console.log(params)
      },

      addNode() {
        var node = new TreeNode({ name: 'new node', isLeaf: false })
        if (!this.data.children) this.data.children = []
        this.data.addChildren(node)
      },

      getNewTree() {
        var vm = this
        function _dfs(oldNode) {
          var newNode = {}

          for (var k in oldNode) {
            if (k !== 'children' && k !== 'parent') {
              newNode[k] = oldNode[k]
            }
          }

          if (oldNode.children && oldNode.children.length > 0) {
            newNode.children = []
            for (var i = 0, len = oldNode.children.length; i < len; i++) {
              newNode.children.push(_dfs(oldNode.children[i]))
            }
          }
          return newNode
        }

        vm.newTree = _dfs(vm.data)
      }
    }
  }
</script>

<style lang="less" rel="stylesheet/less">
  .vtl {
    .vtl-drag-disabled {
      background-color: #d0cfcf;
      &:hover {
        background-color: #d0cfcf;
      }
    }
    .vtl-disabled {
      background-color: #d0cfcf;
    }
  }
</style>

<style lang="less" rel="stylesheet/less" scoped>
  .icon {
    &:hover {
      cursor: pointer;
    }
  }

  .muted {
    color: gray;
    font-size: 80%;
  }
</style>

props

props of vue-tree-list

name type default description
model TreeNode - You can use const head = new Tree([]) to generate a tree with the head of TreeNode type
default-tree-node-name string New node node Default name for new treenode
default-leaf-node-name string New leaf node Default name for new leafnode
default-expanded boolean true Tree is expanded or not

props of TreeNode

attributes

name type default description
id string, number current timestamp The node's id
isLeaf boolean false The node is leaf or not
dragDisabled boolean false Forbid dragging tree node
addTreeNodeDisabled boolean false Show addTreeNode button or not
addLeafNodeDisabled boolean false Show addLeafNode button or not
editNodeDisabled boolean false Show editNode button or not
delNodeDisabled boolean false Show delNode button or not
children array null The children of node

methods

name params description
changeName name Change node's name
addChildren children: object, array Add children to node
remove - Remove node from the tree
moveInto target: TreeNode Move node into another node
insertBefore target: TreeNode Move node before another node
insertAfter target: TreeNode Move node after another node

events

name params description
click TreeNode Trigger when clicking a tree node. You can call toggle of TreeNode to toggle the folder node.
change-name {'id', 'oldName', 'newName'} Trigger after changing a node's name
delete-node TreeNode Trigger when clicking delNode button. You can call remove of TreeNode to remove the node.
add-node TreeNode Trigger after adding a new node
drop {node, src, target} Trigger after dropping a node into another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop into
drop-before {node, src, target} Trigger after dropping a node before another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop before
drop-after {node, src, target} Trigger after dropping a node after another. node: the draggable node, src: the draggable node's parent, target: the node that draggable node will drop after

customize operation icons

The component has default icons for addTreeNodeIcon, addLeafNodeIcon, editNodeIcon, delNodeIcon, leafNodeIcon, treeNodeIcon button, but you can also customize them and can access model, root, expanded as below:

<template v-slot:leafNameDisplay="slotProps">
  <span>{{ slotProps.model.name }} #{{ slotProps.model.id }}</span>
</template>
<template v-slot:addTreeNodeIcon="slotProps">
  <span class="icon">📂</span>
</template>
<template v-slot:addLeafNodeIcon="slotProps">
  <span class="icon"></span>
</template>
<template v-slot:editNodeIcon="slotProps">
  <span class="icon">📃</span>
</template>
<template v-slot:delNodeIcon="slotProps">
  <span class="icon">✂️</span>
</template>
<template v-slot:leafNodeIcon="slotProps">
  <span class="icon">🍃</span>
</template>
<template v-slot:treeNodeIcon="slotProps">
  <span class="icon">
    {{ (slotProps.model.children && slotProps.model.children.length > 0 && !slotProps.expanded) ?
    '🌲' : '' }}</span
  >
</template>

More Repositories

1

Recommend

MapReduce实现基于物品的协同过滤算法,即电影推荐系统
Java
150
star
2

vue-date-range

A vue component for choosing dates and date ranges. Uses Moment.js for date operations.
JavaScript
36
star
3

MessageQueue

基于Flume、Kafka、SparkSql模拟的实时日志分析系统
Java
12
star
4

chinese-chess

Chinese chess realized by javascript
TypeScript
10
star
5

page-switch

jquery轮播图插件
JavaScript
8
star
6

vue-ssr

vue server side render demo
JavaScript
7
star
7

gougou-rn

rn开发的狗狗说应用
Makefile
7
star
8

tiny-react-native

Objective-C
6
star
9

SecondaryCache

基于ehcache、redis实现的二级缓存系统,用akka实现服务器间缓存数据变化后的通信
Java
5
star
10

imooc_go_lottery

Go
4
star
11

ng2-cms

angularjs2开发的cms系统
TypeScript
4
star
12

BaseStation

模拟基站数据并进行简单分析
Java
4
star
13

grab-mooncake-demo

抢月饼demo
HTML
3
star
14

Fusion

多源遥感图像融合系统
IDL
3
star
15

ng2-dropdown-demo

基于ng2-dropdown的demo
TypeScript
3
star
16

react-date-range-ch

react-date-range的中文版本,并做了一些修改
JavaScript
3
star
17

blog

blog src
JavaScript
2
star
18

imooc-go

HTML
2
star
19

imooc_scrapy

HTML
2
star
20

scrapy-demo

学习scrapy的一个demo
Python
2
star
21

ParadeTo.github.io

blog
HTML
1
star
22

taolj

TypeScript
1
star
23

dataguru-javascript

JavaScript突击-从精通到项目实战
JavaScript
1
star
24

react-canvas-renderer

A Simple React Canvas Renderer
JavaScript
1
star
25

ayoulovenl

ayou love nl
JavaScript
1
star
26

learn-compile

Go
1
star
27

DistriCache

模仿spark源码实现的分布式缓存
Scala
1
star
28

web-in-action

web开发实战
JavaScript
1
star
29

dataguru-nodejs

dataguru nodejs
JavaScript
1
star
30

dataguru-algorithm

dataguru-面试算法突击
C++
1
star
31

rbt-demo

断点续传demo
JavaScript
1
star
32

wxDemo

微信小程序DEMO
JavaScript
1
star
33

SSR-MicroFrontend

JavaScript
1
star
34

react-stream-rendering-suspense

React SSR Stream Rendering & Suspense for Data Fetching
JavaScript
1
star
35

webgl-park

JavaScript
1
star
36

LogAnalysis

对网站日志进行简单的分析
Java
1
star
37

imooc-docker

imooc docker
JavaScript
1
star