<template>
<div class="tree-wrapper" :style="'height:' + (showQuery ? 'calc(100% - 35px)' : '')">
<div v-if="showQuery" class="tree-search-box">
<Input v-model="queryModel" placeholder="请输入"
size="small" icon="ios-search" @on-enter="handleQuery" @on-click="handleQuery"/>
<!-- <Button type="primary" @click="handleQuery" style="margin-left: 10px" size="small">查询</Button>-->
<!-- <Button class="ivu-ml-8" @click="handleReset" size="small">重置</Button>-->
</div>
<Tree ref="tree" v-bind="$attrs" v-on="$listeners" :empty-text="emptyText" :render="renderContent"></Tree>
<Dropdown transfer ref="contentMenu" style="display: none" trigger="click" transfer-class-name="tree-drop-down"
v-if="!disabledAll" @on-click="changeClick">
<DropdownMenu slot="list">
<slot name="topItem" :nodeInfo="nodeInfo"></slot>
<DropdownItem name="add" v-if="!disabledAdd"><Icon custom="iconfont iconxinjian1" style="margin-right: 10px"></Icon>{{this.addName}}</DropdownItem>
<DropdownItem name="edit" v-if="!disabledEdit"><Icon type="md-create" style="margin-right: 10px" size="16"></Icon>{{this.editName}}</DropdownItem>
<DropdownItem name="delete" v-if="node.nodeKey != 0 && !disabledDelete">
<Icon type="md-trash" style="margin-right: 10px" size="16"></Icon>{{this.deleteName}}
</DropdownItem>
<slot name="bottomItem" :nodeInfo="nodeInfo"></slot>
</DropdownMenu>
</Dropdown>
</div>
</template>
<script>
export default {
data () {
return {
timeId: '',
queryModel: '',
selectData: [],
// 输入框要修改的内容
inputContent: '',
nodeInfo: [],
oldData: {},
root: '',
node: '',
// 修改前的TreeNode名称
oldName: '',
editState: false,
disabledEdit: false,
disabledDelete: false,
disabledAdd: false,
dragstartNode: '', // 拖拽的节点
dragstartData: '', // 拖拽的节点数据
dropPosition: '', // 节点的位置
dragOverClass: '', // 0:目标节点内 -1:目标节点上 1:目标节点下
overNodeKey: '', // 拖拽经过的节点
nodeIndex: '', // 目标节点的角标,
}
},
props: {
title: { // 传入的字段
type: String,
default: 'title'
},
keyId: { // 传入的字段
type: String,
default: 'value'
},
parentValue: { // 传入的字段
type: String,
default: 'parentValue'
},
showQuery: {
type: Boolean,
default: false
},
emptyText: { // 没有数据时默认显示
type: String,
default: ''
},
disabledAll: { // 是否控制所有权限不可使用
type: Boolean,
default: false
},
maxLength: { // 是否控制所有权限不可使用
type: Number,
default: 50
},
inputWidth: { // 是否控制所有权限不可使用
type: Number,
default: 12
},
draggable: { // 控制是否可以拖拽
type: Boolean,
default: false
},
addName: { // 新建名称
type: String,
default: '新建'
},
deleteName: { // 删除名称
type: String,
default: '删除'
},
editName: { // 编辑名称
type: String,
default: '编辑'
},
editNodeBefore: { // 编辑前的方法,回调
type: Function,
default: (data1, data2, name, callback) => {
callback()
}
},
deleteNodeBefore: { // 删除前的方法,回调
type: Function,
default: (data1, data2, callback) => {
callback()
}
},
onDragBefore: { // 拖拽前的方法,回调
type: Function,
default: (data1, data2, data3, callback) => {
callback()
}
}
},
methods: {
renderContent (h, { root, node, data }) {
return h('span', {
class: {
'ivu-tree-title ivu-tree-title-selected': (data.selected || data.checked) && !this.$attrs.showCheckbox,
'ivu-tree-title': !((data.selected || data.checked) && !this.$attrs.showCheckbox),
'tree-drag-over': this.overNodeKey === data[this.keyId] && this.dragOverClass === 0,
'tree-drag-over-top': this.overNodeKey === data[this.keyId] && this.dragOverClass === -1 && this.nodeIndex === 0,
'tree-drag-over-bottom': this.overNodeKey === data[this.keyId] && this.dragOverClass === 1
},
style: {
display: 'inline-block',
lineHeight: '1.1rem',
cursor: 'pointer',
border: '1px solid transparent'
},
attrs: {
draggable: this.draggable && !(node.nodeKey === 0) && !data.disabled && !data.disabledDrag
},
on: {
click: () => {
let _this = this
if (!data.disabled) { // 控制节点是否可以选择
if (_this.timeId) { // 防止双击事件触发单击事件,但是还会概率触发
window.clearTimeout(_this.timeId)
_this.timeId = null
}
_this.timeId = setTimeout(function () {
if (_this.$attrs.multiple) {
data.selected = !data.selected
// data.checked = !data.checked
_this.selectData.push(data)
_this.onSelectChange(_this.selectData, data)
} else {
_this.selectData.forEach((item) => {
if (item[_this.keyId] !== data[_this.keyId]) {
item.selected = false
// item.checked = false
} else { // 控制当前选中的节点不可以取消选中
item.selected = true
}
})
_this.selectData = []
_this.selectData.push(data)
}
}, 200)
}
},
dblclick: () =>
评论1