1.概述
rx-vue-tree是一个树形控件,因为是自己从零写的一个树形控件,所以可以最大化的在上面做二开.
2.使用
//引入
import { RxVueTree} form 'jpaas-common-lib'
//使用
<template>
<rx-vue-tree></rx-vue-tree>
</template>
export default {
components:{
RxVueTree
}
}
3.API
属性 | 说明 | 类型 | 默认值 |
---|---|---|---|
treeData (不可与url同时使用) | 树的数据 | Array | [] |
v-model (可选) | 指定选中的节点 | Array | [] |
label | 指定树节点的显示名称 | String | ‘title’ |
field | 指定树节点的标识键(唯一值) | String | ‘key’ |
checkStrictly | 是否关联父子节点,关联后选中/取消父节点同时选中/取消子节点 | Boolean | false |
foldPeerNode | 展开时是否收起同级节点 | Boolean | false |
defaultExpandAll | 默认展开所有树节点 | Boolean | false |
expandedKeys (.sync) | 指定展开的树节点 | Array | [] |
asyncTree | 是否异步加载 | Boolean | false |
showCheckbox | 是否显示选中框 | Boolean | true |
active(已废弃用v-model就行) | 当前选中的行,数组只有一个值 [key] | Array | [] |
showIcon | 是否展示树节点图标 | Boolean | true |
treeIcon | 自定义树节点的图标{expand:’’,leaf:’’collapse:’’},expand父节点展开图标,collapse父节点折叠图标,leaf子节点图标 | Object | {tree:’iconjianzhu’,leaf:’iconyonghuhaoyou’,collapse:’iconjianzhu’} |
foldIcon | 自定义展开折叠图标{expand:’’,collapse:’’} | Object | {expand:’’,collapse:’’} |
showEdit | 是否显示右侧节点编辑功能 | Booleab | false |
buttonArr | 自定义右侧节点的按钮 | Array | [{name:’按钮名称’,method:(tree,parenData)=>{console.log(按钮点击触发的方法)}}] |
edit(插槽,不是属性) | 自定义右侧节点的按钮 <div slot=’edit’ slot-scope=”{tree,data} > <div class=”btn”>按钮名称</div> </div> |
slot | - |
showDrag | 是否可拖拽 | Boolean | false |
onlyChildNode | 只能选择子节点 | Boolean | false |
title | 指定节点的title属性为哪个字段 | String | - |
iconStyle | 设置icon的样式,如字体大小,背景色,等 | Object | {fontSize:’14px’} |
url (不可与treeData同时使用) | 请求数据的url | String | - |
params (url取值下) | 请求参数 | Object | {} |
ajaxType (url取值下) | 请求类型(‘get’ or ‘post’) | String | ‘get’ |
contentType (url取值下) | 当请求为post的时候的content-type | String | ‘json’ |
dataField (url取值下) | 通过url取值时,从返回值的哪里取数据,见下面 | String | - |
idField (url取值下) | 某一项数据的某个唯一字段 | String | - |
parentField (url取值下) | 某一项数据的父级的唯一字段(idField) | String | - |
1 dataField 通过url取值时,从返回值的哪里取数据;
* 比如 接口返回的数据是 res => [] 直接是数据 就不用传;
* 如果是res => {success:true,data:[]} 则:dataField:'data'
* 如果是res => {success:true,data:{list:[]} } 则:dataField:'data.list'
2. idField:当前控件的字段标识(例:GROUP_ID_)
3. parentField:当前字段父级的父级字段标识,idField ; (例:PARENT_ID_)
* 当通过url获取的数据为 下面这种单一数组的时候:且数组里面每一个对象里面的某一个<字段> 都会有另一个对象里面的某个<字段> 与之相等 ;
* 比如下面 《技术部1》的 'PARENT_ID_' 与 《技术部》 的 'GROUP_ID_' 相等,表示《技术部1》是《技术部》的子节点 ;
*[
* {"PARENT_ID_": "0", "GROUP_ID_": "1","KEY_": "RX-GROUP","NAME_": "智慧集团"},
* {"PARENT_ID_": "1","GROUP_ID_": "1517038957389590529","KEY_": "productManage","NAME_": "项目管理组"},
* {"PARENT_ID_": "1","GROUP_ID_": "1567392218818592770","KEY_": "tech","NAME_": "技术部"},
* {"PARENT_ID_":"1567392218818592770","GROUP_ID_": "1567392317867081729", "KEY_": "tech1", "NAME_": "技术部1"},
* {"PARENT_ID_": "1567392218818592770","GROUP_ID_": "1567392375341629442","KEY_": "tech2","NAME_": "技术部2"},
* {"PARENT_ID_": "1","GROUP_ID_": "1567392451740876802","KEY_": "sell","NAME_": "销售"},
* {"PARENT_ID_": "1567392451740876802", "GROUP_ID_": "1567392500688404482","KEY_": "sell1","NAME_": "销售1"},
* {"PARENT_ID_": "1567392451740876802", "GROUP_ID_": "1567392561224794113","KEY_": "sell2", "NAME_": "销售2"}
* ]
4.事件
属性 | 说明 | 类型 | 写法 |
---|---|---|---|
rowClick | 节点点击事件,返回当前节点数据(tree),当前节点的父级数据(parentData) ,当前节点的选中状态(active) | Function | (tree,parenData,active)=>{} |
rowDblClick | 同上’rowClick点击事件’ | - | - |
expandClick | 点击折叠图标触发的事件,返回折叠/展开状态(trigger:true/false),当前节点的数据(tree),当前节点的父级数据(parentData) | Function | (trigger,tree,parenData)=>{} |
selectChange | 选择框点击触发事件,返回选择状态(checked:true/false),当前节点的数据(tree),当前节点的父级数据(parentData) | Function | (checked,tree,parentData)=>{} |
5.树数据结构
treeData:[
{
title:'节点名称',//默认为title可通过label指定
key:'节点唯一值',//默认为key,可通过field指定
checked:false,//选择框选中与否。(可选)
icon:'smile'//节点图标,showIcon的情况下显示;不填则会显示默认的图标;
children:[]
}
]
6.示例代码
<template>
<div>
<rx-vue-tree v-model="checked"
:checkStrictly="true"
:treeData.sync="treeData"
:fold-peer-node="false"
:async-tree="true"
:show-icon="true"
:show-edit="true"
:button-arr="buttonArr"
@expandClick="expandClick"
@selectChange="selectChange"
@rowClick="rowClick"
@rowDblClick="rowDblClick"
style="width: 300px"
:show-drag="false"
:expandedKeys.sync="expandedKeys"
:show-checkbox="true"
>
<div slot="edit" slot-scope="{tree,data}">
<div class="btn" @click="add(tree,data)">增加</div>
<div class="btn" @click="edit(tree,data)">编辑</div>
<div class="btn del" @click="del(tree,data)">删除</div>
</div>
</rx-vue-tree>
</div>
</template>
<script>
/*
* 树形控件demo展示
* treeData:[
* {
* title:'节点名称',//默认为title可通过label指定
* key:'节点唯一值',//默认为key,可通过field指定
* checked:false,//选择框选中与否。(可选)
* icon:'smile'//节点图标,showIcon为true的情况下显示;不填则会显示默认的图标;
* children:[],
disabled:false
* }
*
* ]
* */
export default {
name: "rxVueTreeDemo",
data(){
return {
checked:['001-001','002-002','001'],
foldIcon:{
expand:'down',
collapse:'right'
},
buttonArr:[
{
name:'数据方式定义的按钮',
method:this.buttonClick
}
],
expandedKeys:['001','002','002-001','003'],//展开折叠的节点的 key
treeData: [
{
title: '智慧集团',
key: '001',
checked: false,
children: [
{
title: '智慧集团分部一',
key: '001-001',
checked: false,
},
{
title: '自定义图标',
key: '001-002',
checked: false,
icon:'smile'
}
],
},
{
title: '红迅集团',
key: '002',
checked: false,
icon:'iconjianzhu',
children: [
{
title: '红迅集团分部一',
key: '002-001',
checked: false,
icon:'iconjianzhu',
children:[
{
title: '啥子集团',
key: '002-001-001',
checked: false,
icon: "{type:\"customIcon\",icon:\"iconyonghuhaoyou\"}"
}
]
},
{
title: '红迅集团分部二',
key: '002-002',
checked: false,
children:[
{
title: '啥子集团',
key: '002-002-001',
checked: false,
}
]
}
],
},{
title: '拉拉集团',
key: '003',
checked: false,
children: [
{
title: '拉拉集团分部一',
key: '003-001',
checked: false,
children:[
{
title: '拉拉集团',
key: '003-001-001',
checked: false,
}
]
},
{
title: '测试异步加载与自定义图标',
key: '003-002',
checked: false,
icon: "{type:\"c\",icon:\"down\"}",
children:[]
}
],
}
],
}
},
methods:{
buttonClick(tree,parentData){
//点击
console.log('我是通过数据传入数据方式的自定义按钮')
},
add(tree,parentData){
},
edit(tree,parentData){//编辑名字
let i = window.prompt("请输入");
let obj = { title:i};
for (let key in obj){
tree[key] = obj[key] ;
}
},
del(tree,parentData){
let index = parentData.children.findIndex(obj=>obj.key == tree.key);
parentData.children.splice(index,1);
this.treeData = [...this.treeData];
},
rowClick(tree,parentData){
console.log('节点单击');
},
rowDblClick(tree,parentData){
console.log('节点双击');
},
selectChange(checked,tree,parentData){
//选择框选中事件
console.log('选择节点文本:'+ tree.title +'; 选中状态:'+ checked + '选中节点数据:'+ JSON.stringify(tree));
},
expandClick(trigger,tree,parentData){//点击折叠按钮触发的事件
if(tree.children && tree.children.length > 0){
return ;
}
let key = new Date().getTime();
let obj = {
title: '测试异步加载',
key: 'a' + key,
checked: false,
children:[]
}
//测试异步加载,如果返回数据出错需要结束 loading状态 设置tree.loading = false ;
setTimeout(function (){
tree.children = [obj];
},2000)
},
}
}
</script>
<style scoped>
</style>
6.图示
文档更新时间: 2022-11-23 14:54 作者:yangxing