yunshangxie/tuniao-ui/components/tn-tree-node/tn-tree-node.vue

144 lines
3.5 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="tn-tree-node-class tn-tree-node">
<view class="tn-tree__label" @tap="handleClick">
<view
v-if="node.children && node.children.length > 0 && triangle"
class="tn-tree__triangle"
:class="[{'tn-tree__triangle--90deg': !collapsed}]"
></view>
<view class="tn-tree__label__item">
<view v-if="collapsed && node.image" class="tn-tree__label__item__image">
<image :src="node.image" mode="widthFix"></image>
</view>
<view v-if="!collapsed && node.activeImage" class="tn-tree__label__item__image">
<image :src="node.activeImage" mode="widthFix"></image>
</view>
<view class="tn-tree__label__item__text">{{ node.text }}</view>
</view>
</view>
<view v-if="!collapsed && node.children && node.children.length > 0" class="tn-tree__children">
<tn-tree-node
v-for="(item, index) in node.children"
:key="index"
:node="item"
:collapsible="collapsible"
:triangle="triangle"
@click="nodeClick"
></tn-tree-node>
</view>
</view>
</template>
<script>
//如果未开启easycom模式请自行引入tn-tree-node组件
export default {
name: 'tn-tree-node',
props: {
// 节点信息
node: {
type: Object,
default() {
return {}
}
},
// 可以折叠
collapsible: {
type: Boolean,
default: true
},
// 显示三角形
triangle: {
type: Boolean,
default: true
}
},
watch: {
node(val) {
if (val.collapsed !== this.collapsed && this.node.children && this.node.children.length > 0) {
this.collapsed = val.collapsed
}
}
},
data() {
return {
// 标记是否折叠
collapsed: true
}
},
created() {
if (this.node.collapsed === false) {
this.collapsed = false
}
},
methods: {
// 处理点击
handleClick(e) {
if (this.collapsible && this.node.children && this.node.children.length > 0) {
this.collapsed = !this.collapsed
}
this.$emit('click', this.node)
},
nodeClick(e) {
this.$emit('click', e)
}
}
}
</script>
<style lang="scss" scoped>
.tn-tree-node {
.tn-tree {
&__label {
position: relative;
display: inline-flex;
align-items: center;
padding: 20rpx 30rpx;
background-color: transparent;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
// 字体抗锯齿
-webkit-font-smoothing: antialiased;
&__item {
display: flex;
flex-direction: row;
align-items: center;
&__image {
width: 40rpx;
height: 40rpx;
margin-right: 16rpx;
image {
width: 100%;
height: 100%;
}
}
}
}
&__children {
padding-left: 60rpx;
position: relative;
}
&__triangle {
width: 0;
height: 0;
border-top: 12rpx solid transparent;
border-bottom: 12rpx solid transparent;
border-left: 16rpx solid #080808;
margin-right: 20rpx;
transition: transform 0.25s ease-out;
flex-shrink: 0;
&--90deg {
transform:rotate(90deg) translate3d(0, 0, 0);
}
}
}
}
</style>