<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>