原先使用的是Ztree,后来因为更多的定制化要求,还是手写一个算了

<template><div><menu-tree :nodes="nodes" :selected="currentCameraId"></menu-tree></div>
</template><script>import EventBus from "@/utils/EventBus";import MenuTree from "@/views/HomePage2D/components/MenuTree";import dh_config from "static/config/dh-camera";export default {name: "zoneDeviceDir",components: {MenuTree},data() {return {nodes: [],allNodes: [],currentCameraId: ''}},watch: {},computed: {},methods: {//选中cameraClick(item) {this.currentCameraId = this.currentCameraId === item.id ? '' : item.id;if (this.currentCameraId !== '') {EventBus.$emit('showThisVideo',item)}},//全部展开或折叠allNoExpand(flag) {this.nodes.forEach(node => {this.noExpand(node, flag)})},noExpand(node, flag) {node.expand = flag;if (node.children && node.children.length > 0) {node.children.forEach(childNode => {this.noExpand(childNode, flag)})}},//反向定位reverseCamera(id) {this.currentCameraId = id;this.allNoExpand(false);this.nodes = this.allNodes;this.cameraSelect(this.nodes, id);},cameraSelect(nodes, queryData) {for (let i = 0; i < nodes.length; i++) {let node = nodes[i];if (node.children === null && this.corCamera(node, queryData)) {node.expand = true;} else {let deepQuery = this.corCamera(node, queryData);if (deepQuery) {node.expand = true;if (node.children) {this.cameraSelect(node.children, queryData);}}}}},corCamera(node, queryData) {if (node.children === null) {if (node.id === queryData) {return true;} else {return false;}}for (let i = 0; i < node.children.length; i++) {if (this.corCamera(node.children[i], queryData)) {return true;}}return false;},//查找search(queryData) {let array = this.treeSelect(this.allNodes, queryData);this.nodes = array;this.allNoExpand(true);},treeSelect(nodes, queryData) {let newArray = [];for (let i = 0; i < nodes.length; i++) {let node = nodes[i];if (node.children === null && this.treeDeepQuery(node, queryData)) {newArray.push(node);} else {let deepQuery = this.treeDeepQuery(node, queryData);if (deepQuery) {let newNode = JSON.parse(JSON.stringify(node));if (node.children) {newNode.children = this.treeSelect(node.children, queryData);}newArray.push(newNode)}}}return newArray;},treeDeepQuery(node, queryData) {if (node.children === null) {if (node.name.indexOf(queryData) !== -1) {return true;} else {return false;}}for (let i = 0; i < node.children.length; i++) {if (this.treeDeepQuery(node.children[i], queryData)) {return true;}}return false;}},mounted() {EventBus.$on("item-click", this.cameraClick)EventBus.$on('ReversePositioning',this.reverseCamera)let T = thisthis.$axios.get(`/camera/menu/list?&time=${new Date().getTime()}`).then(res => {if (res.data.code !== 200) {this.$Message.error(res.data.msg)} else {T.nodes = res.data.dataT.allNodes = res.data.data}})},beforeDestroy() {}}
</script><style lang="scss" scoped>
</style>

树组件

<template><div class="menu-tree" :class="{'menu-tree-top' : top}"><div v-for="item in nodes" :key="item.id"><!--菜单--><div class="menu-item" @click="folderClick(item)" v-show="item.children !== null && item.num > 0"><div style="position: absolute;top: 0;left: 20px;width: calc(100% - 20px);height: 100%"></div><i class="iconfont iconjia" v-show="!item.expand" style="color: #0ABBE5"></i><i class="iconfont iconjian" v-show="item.expand"></i>{{item.name}}<span v-show="item.num > 0">({{item.num}})</span></div><!--摄像头--><div class="menu-item" @click="itemClick(item)" v-show="item.children === null"  :class="{'menu-item-selected-parent':item.id === selected}"><div style="position: absolute;top: 0;left: 20px;width: calc(100% - 20px);height: 100%" :class="{'menu-item-selected':item.id === selected}"></div><i class="iconfont iconshexiangtou" :class="[{'online': item.statusName === '在线'},{'offline': item.statusName !== '在线'}]"></i><span>({{item.resource}})&nbsp;</span>{{item.name}}</div><!--子菜单递归--><div v-show="item.children && item.children.length > 0 && item.expand" class="child-menu"><menu-tree :nodes="item.children" :selected="selected" :top="false"></menu-tree></div></div></div>
</template><script>import EventBus from "@/utils/EventBus";export default {props: {nodes: Array,selected: String,top: {required: false,default: true}},name: "MenuTree",data() {return {}},mounted() {},methods: {itemClick(item) {EventBus.$emit('item-click', item);},folderClick(item) {this.nodes.forEach(node => {if (node.id === item.id) {node.expand = !node.expand;}})}}}
</script><style lang="scss">.menu-tree {color: #333;font-size: 17px;position: relative;.menu-item {position: relative;padding-left: 25px;height: 40px;line-height: 40px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;.online {color: #1686D8;}.offline {color: #B7C3CE;}.menu-item-selected {border: 1px solid #1686D8;background: rgba(22, 134, 216, 0.1);}&:hover {cursor: pointer;> div {&:first-child {border: 1px solid #1686D8;background: rgba(22, 134, 216, 0.1);}}}&:after {content: "";width: 11px;height: 20px;position: absolute;left: 12px;top: 19px;border-width: 1px;border-top: 1px dashed #52627C;}}.menu-item-selected-parent {font-weight: bold;}.menu-item-camera {width: 100%;}.child-menu {margin-left: 20px;position: relative;&:before {content: "";height: calc(100% - 11px);width: 1px;position: absolute;left: 12px;top: -11px;border-width: 1px;border-left: 1px dashed #52627C;}}}.menu-tree-top > div > .menu-item {/*padding-left: 0;*/&:before {border-left: none;}&:after {border-top: none;}}
</style>

vue 树形目录结构相关推荐

  1. Java实现遍历N级树形目录结构

    最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路. 具体达到的效果类似: 一级目录A: 二级目录A: 三级目录: 四级目录: 文件.txt 二级目录B: 文件1. ...

  2. java遍历树_Java实现遍历N级树形目录结构

    最近挺忙,一直在做项目,然后有个树形目录结构需要返回给前端,这里给大家说一下实现的思路. 具体达到的效果类似: 一级目录A: 二级目录A: 三级目录: 四级目录: 文件.txt 二级目录B: 文件1. ...

  3. Vue基础 目录结构与代码

    作者简介:一名计算机萌新.前来进行学习VUE,让我们一起进步吧.   座右铭:低头赶路,敬事如仪 个人主页:我叫于豆豆吖的主页 目录 前言 一.Vue.js 目录结构 1.目录解析 二.Vue.js ...

  4. 【Vue前端开发学习】第2章,Vue项目目录结构

    文章目录 前言 一.新增router文件夹及其配置方法 二.新增store文件夹及其配置方法 三.index.html.App.vue.main.js三者之间的联系 前言   上一章节,通过Pycha ...

  5. Vue项目目录结构介绍(三)

    前言 本章我们会对一个 Vue 项目的目录结构进行讲解,解释各子目录以及文件的作用,前端的模块化,Vue 单文件组件规范等. 1.基础目录和文件介绍 在上一章,我们通过 vue-cli 创建了一个新的 ...

  6. Linux目录结构——树形目录结构

    Linux目录结构--树形目录结构 根目录:所有目录分区.目录.文件等位置起点 整个树形目录结构中,使用独立的一个"/" 常见的子目录:   /root   /bin   /boo ...

  7. vue php 架构目录,Vue.js 目录结构

    Vue.js 目录结构 上一章节中我们使用了 npm 安装项目,我们在 IDE(Eclipse.Atom等) 中打开该目录,结构如下所示: 目录解析目录/文件说明build项目构建(webpack)相 ...

  8. Vue项目目录结构介绍讲解

    1.Vue单文件组件 node_modules:依赖的node工具包目录 public: 一般用于存放一些静态资源文件,例如图片,视频,音频等资源文件.需要特别注意的是webpack在进行打包的时候, ...

  9. android 树形目录结构的实现(包含源码)

    1.效果如图 ,老板的需求: 1.各种群按照树形目录展开 2.点击列表可以收缩展开 3.选中后进行筛选 2.分析下思路 每个数据都应该有个根节点,也就是上级目录.确定了上级目录就可以找到当前数据对应的 ...

最新文章

  1. 《LeetCode力扣练习》第21题 合并两个有序链表 Java
  2. Spring Boot Admin 2.2.0发布,支持最新Spring Boot/Cloud之外,新增中文展示!
  3. 在Pycharm编辑器中调用getpass模块
  4. Versions maven plugin 修改版本
  5. thinkphp自定义标签库
  6. Atlas元数据存储模型分析
  7. python3安装教程配置配置阿里云
  8. 源码 状态机_阿里中间件seata源码剖析七:saga模式实现
  9. FreeRTOS协程
  10. 小米10/10 Pro详细规格曝光:120Hz高刷新率屏+66W超级闪充
  11. 协议protocol
  12. 测试linux mongodb数据库开启,安装配置MongoDB数据库
  13. Sql server 2008 R2设置定期清理数据库日志文件
  14. 怎么给PDF插入一个文本框写注释?PDF添加注释文本框教程
  15. 冠军团队访谈录|第三届全国人工智能大赛
  16. TensorFlow学习——Tensorflow Object Detection API(win10,CPU)
  17. (转)android EditText 设置弹出数字输入法键盘
  18. 30个Python最佳实践和技巧,你值得拥有~
  19. 解决mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket错误的方法
  20. 详细设计说明书部分样例

热门文章

  1. linux小红帽自带游戏在哪里,安卓手机自带的隐藏游戏在哪 自带游戏位置介绍
  2. 坚果O1投影仪怎么样?适合上班族使用吗?性价比高不高?
  3. Open-E完整版和Lite版
  4. 计算机网络基础(三次握手|TCP/IP协议|五层协议栈|网络安全)
  5. SAP Fiori Belize 主题应用在 SAPGUI 里的一些要点
  6. 对ldd3 中jiq程序的一点笔记
  7. 如何提高华容道的速度
  8. android 卡片滑动详情页,在Mugeda中制作顺畅的左右滑动切换卡片效果的教程
  9. 期货高手完整的一天交易实录
  10. 如何很绅士的使用线程池