<template> <div class="wrapper"> <div class="wrapper-title-left-tree" :key="showKey"> <div v-for="item in treeData" :key="item.id" class="primaryNode"> <div class="top" @click="showBottom(item)" :class="item.show ? 'topSelect' : ''" > {{ item.name }} ({{ item.channelCount }}) <DownOutlined v-show="!item.show" /> <UpOutlined v-show="item.show" /> </div> <div class="bottom" v-show="item.show"> <div v-for="val in item.children" :key="val.id" class="item"> <div class="up" :class="selectId == val.id ? 'select' : ''" @click="showDown(item, val), onSelect(item, val)" > <div> <svg t="1654068878091" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2156" width="0.25rem" height="0.25rem" v-show="selectId == val.id" > <path d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z" p-id="2157" fill="#0058e1" ></path> </svg> <span class="name">{{ val.name }}({{ val.channelCount }})</span> </div> <span v-if="item.children.length < 0">{{ val.total }}</span> <span v-else> <down-outlined v-show="!val.show" /> <up-outlined v-show="val.show" /> </span> </div> <div class="down" v-show="val.show"> <div v-for="child in val.children" :key="child.id" class="child" :class="selectId == child.id ? 'select2' : ''" @click="onSelect(item, child, child)" > <div> <svg t="1654068878091" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2156" width="0.25rem" height="0.25rem" v-show="selectId == child.id" > <path d="M512 624a112 112 0 1 0 0-224 112 112 0 0 0 0 224z" p-id="2157" fill="#0058e1" ></path> </svg> <span class="name"> {{ child.name }} </span> </div> <span>{{ child.channelCount }}</span> </div> </div> </div> </div> </div> </div> </div> </template> <script> import { defineComponent, ref, watch } from 'vue' import { getCameraAllOrgan } from '@/api/videoSurveillance' import { getCameraInfoByAreaId } from '@/api/file' import mybus from '@/myplugins/mybus' import { useRouter } from 'vue-router' import { UpOutlined, DownOutlined } from '@ant-design/icons-vue' import { DETAIL_PAGE_CONTENT_DEFAULT_TAB } from '@/global/GlobalConfig.js' export default defineComponent({ setup() { const router = useRouter() const whoShow1 = ref(whoShow) const showKey = ref(0) const treeData = ref([]) const selectId = ref('') // 初始化 const init = async () => { treeData.value = [] console.log( 'router.currentRoute.value.query.select', router.currentRoute.value.query.select ) let select = router.currentRoute.value.query.select || DETAIL_PAGE_CONTENT_DEFAULT_TAB if (select === '123') { select = '' } console.log( '获取url中的select=====================>', router.currentRoute.value.query.select ) if (select == '基础设施') { let res = {} if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) { res = await getCameraAllOrgan({ parentId: 'S4NbecfYB1DBH8HNULGS34', }) } else { // 西海岸 res = await getCameraInfoByAreaId({ areaId: '70be8c5b664f4bcf869d82f2e8335051', }) } treeData.value = (res.data && res.data.data) || [] // 只有一个,默认展开到二级菜单 if (res.data && res.data.data.length == 1) { showBottom(treeData.value[0]) } } } mybus.on('getDeptList', () => { init() }) const onSelect = async (item, val, child) => { console.log('item--------onSelect---->', item) console.log('val------onSelect------>', val) console.log('child-----onSelect------->', child) mybus.emit('getCameraByParentId', { id: val.id, }) mybus.emit('getListByParentId', val.id) let res = {} if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) { res = await getCameraAllOrgan({ parentId: val.id }) } else { // 西海岸 res = await getCameraInfoByAreaId({ areaId: val.id }) } treeData.value.map((treeDataItem, index) => { if (item.id == treeDataItem.id) { treeData.value[index].children.map((childItem, childIndex) => { if (childItem.id == val.id) { treeData.value[index].children[childIndex].children = res.data.data } }) } }) if (child) { selectId.value = child.id } } watch(selectId, (newVal) => { if (newVal == '') { mybus.emit('getCameraByParentId', { id: '', }) mybus.emit('getListByParentId', '') } }) const showBottom = async (item) => { item.show = !item.show let res = {} if (whoShow1.value && !whoShow1.value.itShowXiHaiAn) { res = await getCameraAllOrgan({ parentId: item.id }) } else { // 西海岸 res = await getCameraInfoByAreaId({ areaId: item.id }) } treeData.value.map((treeDataItem, index) => { if (item.id == treeDataItem.id) { treeData.value[index].children = (res.data && res.data.data) || [] console.log('treeData.value.[index]', treeData.value[index]) } }) } const showDown = (item, val) => { selectId.value = val.id console.log('item---showDown--------->', item) console.log('val----showDown-------->', val) if (item.children) { val.show = !val.show // 取消选中 if (!val.show) { selectId.value = '' } } } return { treeData, showKey, onSelect, showBottom, showDown, selectId, } }, beforeUnmount() { mybus.off('getDeptList') console.log('getDeptList销毁~~~~~~~~~~~~~~~~~~~') }, components: { UpOutlined, DownOutlined, }, }) </script> <style lang="less" scoped> .primaryNode { .top { width: 100%; height: 0.4rem; background: rgba(0, 135, 225, 0.1); display: flex; justify-content: space-between; align-items: center; padding: 0 0.1rem; margin-top: 0.08rem; } .top:hover { cursor: pointer; // 0058e1 透明度 0.5 background: rgba(0, 88, 225, 0.8); color: white; :deep(.anticon) { color: white; } } .topSelect { background: #0058e1; color: white; :deep(.anticon) { color: white; } } .bottom { width: 100%; background: rgba(244, 245, 248, 0.8); padding: 0 0.1rem; // margin-bottom: .08rem; .up { cursor: pointer; height: 0.4rem; display: flex; justify-content: space-between; align-items: center; border-top: 0.01rem solid #ccc; padding: 0 0.1rem; & > div { display: flex; justify-content: flex-start; } .name { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; word-break: break-all; } } .up:hover { .name { color: #0058e1; font-weight: 600; } span { color: #0058e1; font-weight: 600; } } .select { padding: 0 0.1rem 0 0; .name { width: 1.7rem; color: #0058e1 !important; font-weight: 600; } span { color: #0058e1; font-weight: 600; } } .item:nth-of-type(1) .up { border-top: none; } .down { width: 100%; .child { cursor: pointer; height: 0.4rem; display: flex; justify-content: space-between; align-items: center; padding: 0 0.1rem; & > div { display: flex; justify-content: flex-start; } .name { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; word-break: break-all; } } .child:hover { .name { color: #0058e1; font-weight: 600; } span { color: #0058e1; font-weight: 600; } } .select2 { .name { width: 1.7rem; color: #0058e1; font-weight: 600; } span { color: #0058e1; font-weight: 600; } padding: 0 0.1rem 0 0; } } } } </style>