iview的树组件在有默认选中状态的时候默认选中状态的样式改变有bug,默认选中的样式不好看,鉴于此,有renderContent来改造iview的树组件,

效果如图

代码如下

<template>
<div class="transfer">
<div class="transfer-left">
<div class="transfer-header">
<h2 class="title">源数据</h2>
</div>
<div class="transfer-body">
<vue-scroll>
<Tree
ref="tree"
:data="data2"
multiple
:render="renderContent">
</Tree>
</vue-scroll>
</div>
</div>
<div class="transfer-middle"></div>
<div class="transfer-right">
<div class="transfer-header">
<h2 class="title">目的数据</h2>
</div>
<div class="transfer-body">
<ul class="transfer-lists">
<li class="transfer-list" v-for="(item, index) in selectedList" :key="index">
<span class="name">{{item.title}}</span>
<Button class="btn-del" icon="md-close" type="text" @click="cancelSelected(item, index)"></Button>
</li>
</ul>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'transfer',
data () {
return {
SelectClass: 'ivu-tree-title ivu-tree-title-selected',
DefineClass: 'ivu-tree-title',
selectedList: [],
selectedData: [
{
'id': 111,
'title': 'leaf 1-1-1'
},
{
'id': 112,
'title': 'leaf 1-1-2'
}
],
data2: [
{
id: 1,
title: 'parent 1',
expand: true,
hasChild: true,
children: [
{
id: 11,
title: 'parent 1-1',
expand: true,
hasChild: true,
children: [
{
id: 111,
title: 'leaf 1-1-1'
},
{
id: 112,
title: 'leaf 1-1-2'
}
]
},
{
id: 12,
title: 'parent 1-2',
expand: true,
hasChild: true,
children: [
{
id: 121,
title: 'leaf 1-2-1'
},
{
id: 122,
title: 'leaf 1-2-2'
}
]
}
]
}
]
}
},
created () {
for (let i = 0, l = this.selectedData.length; i < l; i++) {
this.traverseTree(this.data2[0], this.selectedData[i].id, false)
}
this.selectedList = this.selectedData
},
methods: {
iconType (hasChild, expand) {
let iconType = 'ios-document'
if (hasChild) {
if (expand) {
iconType = 'ios-folder-open'
} else {
iconType = 'ios-folder'
}
} else {
iconType = 'ios-document'
}
return iconType
},
cancelSelected (item, index) {
this.selectedList.splice(index, 1)
this.traverseTree(this.data2[0], item.id, true)
this.$refs.tree.$el.querySelectorAll('.ivu-tree-title-selected')[index].className = 'ivu-tree-title'
},
traverseTree (node, id, isDel) {
if (!node) {
return
}
if (node.id === id) {
if (isDel) {
node.selected = false
} else {
node.selected = true
}
}
let children = node.children
if (children && children.length > 0) {
for (let i = 0, l = children.length; i < l; i++) {
this.traverseTree(children[i], id, isDel)
}
}
},
renderContent (h, { root, node, data }) {
if (node.node.selected) {
return h('div', {
class: ['ivu-tree-title', 'ivu-tree-title-selected'],
on: {
click: (e) => {
let thisClassName = e.target.className
let parentClassName = e.target.parentNode.className
if (thisClassName === this.SelectClass || parentClassName === this.SelectClass) {
node.node.selected = false
if (thisClassName === this.SelectClass) {
e.target.className = this.DefineClass
} else {
e.target.parentNode.className = this.DefineClass
}
} else {
node.node.selected = true
if (thisClassName === this.DefineClass) {
e.target.className = this.SelectClass
} else {
e.target.parentNode.className = this.SelectClass
}
}
this.OnSelect(node)
}
}
},
[
h('Icon', {
props: {
type: this.iconType(node.node.hasChild, node.node.expand)
}
}),
h('span', data.title),
h('Icon', {
props: {
type: 'md-checkmark'
}
})
])
} else {
return h('div', {
class: ['ivu-tree-title'],
on: {
click: (e) => {
let thisClassName = e.target.className
let parentClassName = e.target.parentNode.className
if (thisClassName === this.SelectClass || parentClassName === this.SelectClass) {
node.node.selected = false
if (thisClassName === this.SelectClass) {
e.target.className = this.DefineClass
} else {
e.target.parentNode.className = this.DefineClass
}
} else {
node.node.selected = true
if (thisClassName === this.DefineClass) {
e.target.className = this.SelectClass
} else {
e.target.parentNode.className = this.SelectClass
}
}
this.OnSelect(node)
}
}
},
[
h('Icon', {
props: {
type: this.iconType(node.node.hasChild, node.node.expand)
}
}),
h('span', data.title),
h('Icon', {
props: {
type: 'md-checkmark'
}
})
])
}
},
OnSelect (data) {
this.$emit('OnSelectChange', data)
this.selectedList = this.$refs.tree.getSelectedNodes()
}
}
}
</script>
<style lang="scss" scoped>
@import './transfer.scss';
</style>
<style lang="scss">
.transfer {
.ivu-tree-title-selected,
.ivu-tree-title-selected:hover,
.ivu-tree-title:hover {
background-color: #fff;
}
.ivu-tree-title {
vertical-align: middle;
span {
margin: 0 5px;
}
.ivu-icon {
color: #2b85e4;
font-size: 16px;
&.ivu-icon-md-checkmark {
display: none;
}
}
&.ivu-tree-title-selected {
.ivu-icon {
&.ivu-icon-md-checkmark {
display: inline-block;
color: #19be6b;
}
}
}
}
}
</style>

对于节点的点击事件,可以做简单的抽离,js部分代码如下:

export default {
name: 'transfer',
data () {
return {
nodeKey: null,
SelectClass: 'ivu-tree-title ivu-tree-title-selected',
DefineClass: 'ivu-tree-title',
selectedList: [],
selectedData: [
{
'id': 111,
'title': 'leaf 1-1-1'
},
{
'id': 112,
'title': 'leaf 1-1-2'
}
],
data2: [
{
id: 1,
title: 'parent 1',
expand: true,
hasChild: true,
children: [
{
id: 11,
title: 'parent 1-1',
expand: true,
hasChild: true,
children: [
{
id: 111,
title: 'leaf 1-1-1'
},
{
id: 112,
title: 'leaf 1-1-2'
}
]
},
{
id: 12,
title: 'parent 1-2',
expand: true,
hasChild: true,
children: [
{
id: 121,
title: 'leaf 1-2-1'
},
{
id: 122,
title: 'leaf 1-2-2'
}
]
}
]
}
]
}
},
created () {
for (let i = 0, l = this.selectedData.length; i < l; i++) {
this.traverseTree(this.data2[0], this.selectedData[i].id, false)
}
this.selectedList = this.selectedData
},
methods: {
iconType (hasChild, expand) {
let iconType = 'ios-document'
if (hasChild) {
if (expand) {
iconType = 'ios-folder-open'
} else {
iconType = 'ios-folder'
}
} else {
iconType = 'ios-document'
}
return iconType
},
cancelSelected (item, index) {
this.selectedList.splice(index, 1)
this.traverseTree(this.data2[0], item.id, true)
this.$refs.tree.$el.querySelectorAll('.ivu-tree-title-selected')[index].className = 'ivu-tree-title'
},
renderContent (h, { root, node, data }) {
if (node.node.selected) {
return h('div', {
class: ['ivu-tree-title', 'ivu-tree-title-selected'],
on: {
click: (e) => {
let thisClassName = e.target.className
let parentClassName = e.target.parentNode.className
let o = this.changeNode(thisClassName, parentClassName)
node.node.selected = o.selected
if (thisClassName === o.otherClassName) {
e.target.className = o.className
} else if (parentClassName === o.otherClassName) {
e.target.parentNode.className = o.className
}
this.OnSelect(node)
}
}
},
[
h('Icon', {
props: {
type: this.iconType(node.node.hasChild, node.node.expand)
}
}),
h('span', data.title),
h('Icon', {
props: {
type: 'md-checkmark'
}
})
])
} else {
return h('div', {
class: ['ivu-tree-title'],
on: {
click: (e) => {
let thisClassName = e.target.className
let parentClassName = e.target.parentNode.className
let o = this.changeNode(thisClassName, parentClassName)
node.node.selected = o.selected
if (thisClassName === o.otherClassName) {
e.target.className = o.className
} else if (parentClassName === o.otherClassName) {
e.target.parentNode.className = o.className
}
this.OnSelect(node)
}
}
},
[
h('Icon', {
props: {
type: this.iconType(node.node.hasChild, node.node.expand)
}
}),
h('span', data.title),
h('Icon', {
props: {
type: 'md-checkmark'
}
})
])
}
},
OnSelect (data) {
this.$emit('OnSelectChange', data)
this.selectedList = this.$refs.tree.getSelectedNodes()
},
changeNode (thisClassName, parentClassName) {
let selected = false
let className = this.DefineClass
let otherClassName = this.SelectClass
if (thisClassName === this.SelectClass || parentClassName === this.SelectClass) {
selected = false
className = this.DefineClass
otherClassName = this.SelectClass
} else {
selected = true
className = this.SelectClass
otherClassName = this.DefineClass
}
return {
selected,
className,
otherClassName
}
},
traverseTree (node, id, isDel) {
if (!node) {
return
}
if (node.id === id) {
if (isDel) {
node.selected = false
} else {
node.selected = true
}
}
let children = node.children
if (children && children.length > 0) {
for (let i = 0, l = children.length; i < l; i++) {
this.traverseTree(children[i], id, isDel)
}
}
}
}
}

iView 用renderContent自定义树组件的更多相关文章

  1. iview table里面 插入下拉列表组件(自定义组件)一定要加key,不加key,table开始会加载所有数据,然后再从第2页点回第一页,就会走onChange事件,混乱的逻辑,切记加:key

    iview table里面 插入下拉列表组件(自定义组件)一定要加key,不加key,table开始会加载所有数据,然后再从第2页点回第一页,就会走onChange事件,混乱的逻辑,切记加:key 关 ...

  2. 基于HTML5树组件延迟加载技术实现

    HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的 ...

  3. HT for Web的HTML5树组件延迟加载技术实现

    HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的 ...

  4. SSIS自定义数据流组件开发(血路)

    由于特殊的原因(怎么特殊不解释),需要开发自定义数据流组件处理. 查了很多资料,用了不同的版本,发现各种各样的问题没有找到最终的解决方案. 遇到的问题如下: 用VS2015编译出来的插件,在SSDTB ...

  5. Android Studio开发基础之自定义View组件

    一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自an ...

  6. [UE4]自定义MovementComponent组件

    自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...

  7. 【转】Android学习基础自定义Checkbox组件

    原文网址:http://forum.maiziedu.com/thread-515-1-1.html heckbox组件是一种可同时选中多项的基础控件,即复选框,在android学习中,Checkbo ...

  8. GUI树组件,表格

    树组件首先要new一个JTree,再加结点,然后添加到 JScrollPane JTree tree1=new JTree(); //.......添加节点 add(new ScrollPane(tr ...

  9. Tree( 树) 组件[4]

    本节课重点了解 EasyUI 中 Tree(树)组件的使用方法, 这个组件依赖于 Draggable(拖动)和 Droppable(放置)组件.一.方法列表 //部分方法onClick : funct ...

随机推荐

  1. Redis单点到集群迁移

    目录 一.简介 一.简介 1.环境 源 192.168.1.185的6379 目标 192.168.1.91的7001,7002 192.168.1.92的7003,7004 192.168.1.94 ...

  2. CF116B Little Pigs and Wolves 题解

    Content 有一张 \(n\times m\) 的地图,其中,\(\texttt{P}\) 代表小猪,\(\texttt{W}\) 代表狼.如果狼的上下左右有一头以上的小猪,那么它会吃掉其中相邻的 ...

  3. 树莓派CM4 wifi频繁断开连接

    CM4核心板上自带的wifi模块连接上华为/小米的路由器5G热点以后,会频繁断开连接,断开连接前使用 iw dev 查看wifi信息如下: phy#0 Unnamed/non-netdev inter ...

  4. 不同机房vpc使用openswan打通内网

    1.测试环境: 北京6云主机:120.92.51.75/10.0.3.13     VPC:10.0.0.0/16 Ren-test 上海2云主机:42.157.163.120/192.168.3.3 ...

  5. js文件需要jsp页面中的div时,此js文件必须在div之后才能获得值,否则获取不到

    js文件需要jsp页面中的div时,此js文件必须在div之后才能获得值,否则获取不到 2.图2的内容为directionkey.js的内容

  6. textarea控件好奇怪啊,用<s:if>标签居然不在一行回出现很多的空格,奇葩啊

    textarea控件好奇怪啊,用<s:if>标签居然不在一行回出现很多的空格,奇葩啊

  7. js中的jQuery Validate增加手机号码验证

    $.validator.addMethod("isPhone", function(value,element) { var length = value.length; var ...

  8. java源码——计算立体图形的表面积和体积

    计算球,圆柱,圆锥的表面积和体积. 利用接口实现. 上代码. Contants.java 常量存储类 package com.fuxuemingzhu.solidgraphics.contants; ...

  9. 【LeetCode】227. Basic Calculator II 解题报告(Python)

    [LeetCode]227. Basic Calculator II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  10. 【LeetCode】165. Compare Version Numbers 解题报告(Python)

    [LeetCode]165. Compare Version Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...