基于elemen-ui封装的独立tree组件

133 阅读8分钟

一.背景

部门原有的vue组件库是iview,iview的tree组件所提供的交互功能和UIUE样式不能满足客户对tree的要求,需要重新封装tree组件放到项目工程里去,基于elemnet-ui的tree所暴露出的交互方法和uiue样式刚好能够满足,所以直接拿过来进行改造,满足项目中的使用。

二.集成步骤

1.具体代码参照如下

<template><div class="treePage"><uap-tree:data="data":props="defaultProps"@node-click="selectedNode"node-key="id"default-expand-all:expand-on-click-node="false"><span class="custom-tree-node" slot-scope="{ node, data }"><span><span class="iconItem"><svg class="icon" aria-hidden="true"><use:xlink:href="'#' + (node.icon || 'icon_treesel_orgdenor')"></use></svg></span><span>{{ node.label }}</span></span><span><span class="action add" @click="() => append(data)">Append</span><span class="action" @click="() => remove(node, data)">Delete</span></span></span></uap-tree><div class="api-cnt"><ahref="https://element.eleme.cn/#/zh-CN/component/tree#events"target="_blank">tree API</a></div></div></template><script>import UapTree from "@/components/customComponents/tree";let id = 1000;export default {data() {return {defaultProps: {children: "children",label: "label"},data: [{id: 1,label: "一级 1",children: [{id: 4,label: "二级 1-1",children: [{id: 9,label: "三级 1-1-1"},{id: 10,label: "三级 1-1-2"}]}]},{id: 2,label: "一级 2",children: [{id: 5,label: "二级 2-1"},{id: 6,label: "二级 2-2"}]},{id: 3,label: "一级 3",children: [{id: 7,label: "二级 3-1"},{id: 8,label: "二级 3-2"}]}]};},components: {UapTree},methods: {//添加append(data) {const newChild = { id: id++, label: "testtest", children: [] };if (!data.children) {this.$set(data, "children", []);}data.children.push(newChild);},//删除remove(node, data) {console.log("删除");const parent = node.parent;const children = parent.data.children || parent.data;const index = children.findIndex(d => d.id === data.id);children.splice(index, 1);},//选中selectedNode(data, node) {console.log("selected");},//自定义渲染内容renderContent(h, { node, data, store }) {return (<span class="custom-tree-node"><span><i class="iconfont icon_treesel_orgdenor"></i><span>{node.label}</span></span><span><span class="action add" on-click={() => this.append(data)}>Append</span><span class="action" on-click={() => this.remove(node, data)}>Delete</span></span></span>);}}};</script><style scoped lang="less">.api-cnt {font-size: 18px;text-align: center;margin-top: 100px;}.treePage {height: 100%;width: 500px;overflow-x: auto;max-width: 100%;background-color: #fff;}// 以下css样式为个性化定制style样式可以直接照搬/deep/ .ma-tree-node.is-current:focus > .ma-tree-node__content {.custom-tree-node .action {display: inline-block;}}.ma-tree-node .ma-tree-node__content:hover {.custom-tree-node .action {display: inline-block;}}/deep/ .ma-tree-node.is-current:hover > .ma-tree-node__content {.custom-tree-node .action {display: inline-block;}}/deep/ .custom-tree-node {flex: 1;display: flex;align-items: center;justify-content: space-between;font-size: 14px;padding-right: 8px;/deep/ .icon {width: 1.5em;height: 1.5em;vertical-align: -0.15em;fill: currentColor;overflow: hidden;margin-right: 4px;}.iconItem {margin: 0 8px;}.action {display: none;margin-right: 5px;}}</style>

2.具体效果demo

3.每一层级tree的图标通过

三.组件对外提供的事件和属性

Attributes

参数

说明

类型

可选值

默认值

data

展示数据

array

empty-text

内容为空的时候展示的文本

String

node-key

每个树节点用来作为唯一标识的属性,整棵树应该是唯一的

String

props

配置选项,具体看下表

object

render-after-expand

是否在第一次展开某个树节点后才渲染其子节点

boolean

true

load

加载子树数据的方法,仅当 lazy 属性为true 时生效

function(node, resolve)

render-content

树节点的内容区的渲染 Function

Function(h, { node, data, store }

highlight-current

是否高亮当前选中节点,默认值是 false。

boolean

false

default-expand-all

是否默认展开所有节点

boolean

false

expand-on-click-node

是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。

boolean

true

check-on-click-node

是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。

boolean

false

auto-expand-parent

展开子节点的时候是否自动展开父节点

boolean

true

default-expanded-keys

默认展开的节点的 key 的数组

array

show-checkbox

节点是否可被选择

boolean

false

check-strictly

在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false

boolean

false

default-checked-keys

默认勾选的节点的 key 的数组

array

current-node-key

当前选中的节点

string, number

filter-node-method

对树节点进行筛选时执行的方法,返回 true 表示这个节点可以显示,返回 false 则表示这个节点会被隐藏

Function(value, data, node)

accordion

是否每次只打开一个同级树节点展开

boolean

false

indent

相邻级节点间的水平缩进,单位为像素

number

16

icon-class

自定义树节点的图标

string

-

-

lazy

是否懒加载子节点,需与 load 方法结合使用

boolean

false

draggable

是否开启拖拽节点功能

boolean

false

allow-drag

判断节点能否被拖拽

Function(node)

allow-drop

拖拽时判定目标节点能否被放置。type 参数有三种情况:'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后

Function(draggingNode, dropNode, type)

¶props

参数

说明

类型

可选值

默认值

label

指定节点标签为节点对象的某个属性值

string, function(data, node)

children

指定子树为节点对象的某个属性值

string

disabled

指定节点选择框是否禁用为节点对象的某个属性值

boolean, function(data, node)

isLeaf

指定节点是否为叶子节点,仅在指定了 lazy 属性的情况下生效

boolean, function(data, node)

¶方法

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

方法名

说明

参数

filter

对树节点进行筛选操作

接收一个任意类型的参数,该参数会在 filter-node-method 中作为第一个参数

updateKeyChildren

通过 keys 设置节点子元素,使用此方法必须设置 node-key 属性

(key, data) 接收两个参数,1. 节点 key 2. 节点数据的数组

getCheckedNodes

若节点可被选择(即 show-checkboxtrue),则返回目前被选中的节点所组成的数组

(leafOnly, includeHalfChecked) 接收两个 boolean 类型的参数,1. 是否只是叶子节点,默认值为 false 2. 是否包含半选节点,默认值为 false

setCheckedNodes

设置目前勾选的节点,使用此方法必须设置 node-key 属性

(nodes) 接收勾选节点数据的数组

getCheckedKeys

若节点可被选择(即 show-checkboxtrue),则返回目前被选中的节点的 key 所组成的数组

(leafOnly) 接收一个 boolean 类型的参数,若为 true 则仅返回被选中的叶子节点的 keys,默认值为 false

setCheckedKeys

通过 keys 设置目前勾选的节点,使用此方法必须设置 node-key 属性

(keys, leafOnly) 接收两个参数,1. 勾选节点的 key 的数组 2. boolean 类型的参数,若为 true 则仅设置叶子节点的选中状态,默认值为 false

setChecked

通过 key / data 设置某个节点的勾选状态,使用此方法必须设置 node-key 属性

(key/data, checked, deep) 接收三个参数,1. 勾选节点的 key 或者 data 2. boolean 类型,节点是否选中 3. boolean 类型,是否设置子节点 ,默认为 false

getHalfCheckedNodes

若节点可被选择(即 show-checkboxtrue),则返回目前半选中的节点所组成的数组

-

getHalfCheckedKeys

若节点可被选择(即 show-checkboxtrue),则返回目前半选中的节点的 key 所组成的数组

-

getCurrentKey

获取当前被选中节点的 key,使用此方法必须设置 node-key 属性,若没有节点被选中则返回 null

getCurrentNode

获取当前被选中节点的 data,若没有节点被选中则返回 null

setCurrentKey

通过 key 设置某个节点的当前选中状态,使用此方法必须设置 node-key 属性

(key) 待被选节点的 key,若为 null 则取消当前高亮的节点

setCurrentNode

通过 node 设置某个节点的当前选中状态,使用此方法必须设置 node-key 属性

(node) 待被选节点的 node

getNode

根据 data 或者 key 拿到 Tree 组件中的 node

(data) 要获得 node 的 key 或者 data

remove

删除 Tree 中的一个节点,使用此方法必须设置 node-key 属性

(data) 要删除的节点的 data 或者 node

append

为 Tree 中的一个节点追加一个子节点

(data, parentNode) 接收两个参数,1. 要追加的子节点的 data 2. 子节点的 parent 的 data、key 或者 node

insertBefore

为 Tree 的一个节点的前面增加一个节点

(data, refNode) 接收两个参数,1. 要增加的节点的 data 2. 要增加的节点的后一个节点的 data、key 或者 node

insertAfter

为 Tree 的一个节点的后面增加一个节点

(data, refNode) 接收两个参数,1. 要增加的节点的 data 2. 要增加的节点的前一个节点的 data、key 或者 node

¶Events

事件名称

说明

回调参数

node-click

节点被点击时的回调

共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身。

node-contextmenu

当某一节点被鼠标右键点击时会触发该事件

共四个参数,依次为:event、传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身。

check-change

节点选中状态发生变化时的回调

共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点本身是否被选中、节点的子树中是否有被选中的节点

check

当复选框被点击的时候触发

共两个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、树目前的选中状态对象,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性

current-change

当前选中节点变化时触发的事件

共两个参数,依次为:当前节点的数据,当前节点的 Node 对象

node-expand

节点被展开时触发的事件

共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身

node-collapse

节点被关闭时触发的事件

共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身

node-drag-start

节点开始拖拽时触发的事件

共两个参数,依次为:被拖拽节点对应的 Node、event

node-drag-enter

拖拽进入其他节点时触发的事件

共三个参数,依次为:被拖拽节点对应的 Node、所进入节点对应的 Node、event

node-drag-leave

拖拽离开某个节点时触发的事件

共三个参数,依次为:被拖拽节点对应的 Node、所离开节点对应的 Node、event

node-drag-over

在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)

共三个参数,依次为:被拖拽节点对应的 Node、当前进入节点对应的 Node、event

node-drag-end

拖拽结束时(可能未成功)触发的事件

共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点(可能为空)、被拖拽节点的放置位置(before、after、inner)、event

node-drop

拖拽成功完成时触发的事件

共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event

¶Scoped Slot

name

说明

自定义树节点的内容,参数为 { node, data }