货无忧安装平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

127 lines
2.8 KiB

<template>
<view class="tree_container">
<block v-for="item in $props.treeData" :key="item.id">
<view class="">
<view :class="{'tree_label': true, 'active': item.id === $props.activeId}" @click="nodeClick(item)">
<template v-if="item.children && item.children.length > 0">
<view class="tree_icon">
<view :class="{'icon': true ,'down': isOpen(item.id)}">
<u-icon name="arrow-down-fill" color="#adafb6" size="26"></u-icon>
</view>
</view>
</template>
<text>{{item.title}}</text>
</view>
<!-- #ifdef H5 -->
<view class="tree_item" :style="{'grid-template-rows': isOpen(item.id) ? '1fr' : '0fr'}">
<!-- #endif -->
<!-- #ifdef APP -->
<view class="tree_item" :style="{'display': isOpen(item.id) ? 'block' : 'none'}">
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view class="tree_item" :style="{'display': isOpen(item.id) ? 'block' : 'none'}">
<!-- #endif -->
<template v-if="item.children && item.children.length > 0">
<MyTree :treeData="item.children" @node-click="$emit('node-click', $event)"
:activeId="$props.activeId"></MyTree>
</template>
</view>
</view>
</block>
</view>
</template>
<script setup lang="ts">
import { defineProps, ref } from 'vue';
const $props = defineProps(["treeData", 'activeId'])
console.log('$props :>> ', $props);
const $emit = defineEmits(["node-click"])
const expandedKeys = ref([])
const treeData = $props.treeData
const isOpen = (id) => {
// 判断节点id在不在数组中,在则显示,不在则隐藏
return expandedKeys.value.includes(id)
}
const nodeClick = (item) => {
$emit("node-click", item)
if (item.children && item.children.length) {
let index = expandedKeys.value.indexOf(item.id)
if (index > -1) {
// 如果当前节点id存在数组中,则删除
expandedKeys.value.splice(index, 1)
} else {
// 如果当前节点id不存在数组中,则添加
expandedKeys.value.push(item.id)
}
}
}
</script>
<style scoped lang="scss">
.tree_label {
padding: 10upx 40upx;
position: relative;
&.active {
background-color: var(--subjectColor);
border-radius: 10upx;
color: #fff;
:deep(.u-icon__icon) {
color: #fff !important;
}
}
}
.tree_item {
margin-top: 10upx;
padding-left: 40upx;
}
// 头部搜索
.tree_item {
display: grid;
grid-template-rows: 0fr;
transition: all 0.3s;
// overflow: hidden;
&>view {
min-height: 0;
overflow: hidden;
}
// &>div,
// &>form {
// }
}
.tree_icon {
position: absolute;
left: 5upx;
top: 50%;
transform: translateY(-50%);
margin-right: 20upx;
transform-origin: center;
.icon {
transition: all 0.3s;
transform: rotate(-90deg);
}
.down {
transform: rotate(0deg);
}
}
</style>