树形侧边栏(展开、全选、切换名称)

在这里插入图片描述

父文件: index.vue

<template>
  <div class="h-full p20px bg-#f5f5f5">
    <ContentWrap class="w-260px h-[calc(100vh-200px)] min-h-700px">
      <TenantTree @select="tentantSelect" />
    </ContentWrap>
  </div>
</template>

<script setup lang="ts">
import TenantTree from '../components/TenantTree/TenantTree.vue'

// 组织选择变化
const mutData = ref<String>('')
const tentantSelect = (data) => {
  mutData.value = data?.join(',')
}
</script>

组件: TenantTree.vue

<script lang="ts" setup>
import { tenantTreeList4dict } from '@/api/common/dict'
import { propTypes } from '@/utils/propTypes'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
defineOptions({ name: 'TenantTree' })
const nodeKey = 'id'
const treeNodeAllFlag = ref<Boolean>(true)
const allShow = ref<Boolean>(true)
const shortName = ref<Boolean>(false)
const tenantTree = ref([])
const defaultProps = { children: 'children', label: 'tenantName' }
const treeRef = ref()
const mutData = ref<Array>([])
const { wsCache } = useCache()
const ROLE_ALIAS = wsCache.get(CACHE_KEY.ROLE_ALIAS)
const emit = defineEmits(['select'])

const checkChange = () => {
  const all = getAllNodeKeys()
  mutData.value = treeRef.value?.getCheckedKeys(false)
  if (all.length !== mutData.value.length && mutData.value.length) {
    emit('select', mutData.value)
  }
}

// 获取组织
const getTenantTree = async () => {
  try {
    const { data = [] } = await tenantTreeList4dict()
    tenantTree.value = data
    await nextTick(async () => {
      await handleCheckedTreeNodeAll()
      mutData.value = treeRef.value?.getCheckedKeys(false)
    })
  } finally {
  }
}

/** 展开/折叠全部 */
const handleTreeExpand = (type) => {
  allShow.value = type
  const nodes = treeRef.value?.store.nodesMap
  for (let node in nodes) {
    if (nodes[node].expanded === allShow.value) {
      continue
    }
    nodes[node].expanded = allShow.value
  }
}

/** 全选/全不选 */
const handleCheckedTreeNodeAll = async () => {
  if (treeNodeAllFlag.value) {
    await treeRef.value?.store.setCheckedKeys(getAllNodeKeys())
    emit('select', mutData.value)
  } else {
    await treeRef.value?.store.setCheckedKeys([])
    emit('select', mutData.value)
  }
}

const getAllNodeKeys = () => {
  let keys = []
  tenantTree.value.forEach((node) => {
    keys.push(node[nodeKey])
    getAllChildNodeKeys(node, keys)
  })
  return keys
}

const getAllChildNodeKeys = (node, keys) => {
  if (node.children) {
    node.children.forEach((child) => {
      keys.push(child[nodeKey])
      getAllChildNodeKeys(child, keys)
    })
  }
}

onMounted(async () => {
  const isSelectRole = ROLE_ALIAS.includes('selected')
  if (!isSelectRole) {
    getTenantTree()
  } else {
    emit('select', mutData.value)
  }
})
</script>
<template>
  <div class="font-size-14px pb-10px mb-10px border-b-1 border-b-solid border-b-color-#ccc">
    <div class="bg-#cce1ff text-center line-height-30px mb10px">组织机构</div>
    <div>
      全选/清空:
      <el-switch
        v-model="treeNodeAllFlag"
        active-text="是"
        inactive-text="否"
        inline-prompt
        @change="handleCheckedTreeNodeAll"
      />
    </div>
    <div>
      展开/折叠:
      <el-switch v-model="allShow" active-text="展开" inactive-text="折叠" inline-prompt @change="handleTreeExpand" />
    </div>
    <div>
      简称/全称:
      <el-switch v-model="shortName" active-text="简称" inactive-text="全称" inline-prompt />
    </div>
  </div>
  <div class="h-500px overflow-y-auto! mr-[-18px]">
    <el-tree
      ref="treeRef"
      :data="tenantTree"
      show-checkbox
      :node-key="nodeKey"
      default-expand-all
      :props="defaultProps"
      @check-change="checkChange"
      indent="6"
      :check-strictly="true"
      accordion
    >
      <template #default="{ node, data }">
        <span class="">
          <el-text v-show="shortName" @click="console.log(data.shortName)" class="w-150px" truncated>
            {{ data.shortName }}
          </el-text>
          <el-tooltip class="box-item" effect="dark" :content="node.label" placement="top" :show-after="500">
            <el-text v-show="!shortName" @click="console.log(data.shortName)" class="w-150px" truncated>
              {{ node.label }}
            </el-text>
          </el-tooltip>
        </span>
      </template>
    </el-tree>
  </div>
</template>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/546402.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ExtendSim花生酱加工厂模型

该模型展示了ExtendSim可靠性模块与ExtendeSim离散速率技术相结合的协同作用。 在花生酱加工厂的最初阶段&#xff0c;花生经过烘烤和冷却。冷却后的花生经过热烫或水烫去外皮。这些经过漂白的花生进入过程的混合部分&#xff0c;在研磨机中用盐、葡萄糖和氢化油稳定剂将其粉碎…

链表基础3——单链表的逆置

链表的定义 #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node; Node* createNode(int data) { Node* newNode (Node*)malloc(sizeof(Node)); if (!newNode) { return NULL; } newNode->data …

【七 (1)指标体系建设-构建高效的故障管理指标体系】

目录 文章导航一、故障概述1、故障&#xff1a;2、故障管理&#xff1a; 二、指标体系概述1、指标2、指标体系 三、指标体系构建难点1、管理视角2、业务视角3、技术视角 四、指标体系构建原则1、与战略目标对齐2、综合和平衡3、数据可获得性4、可操作性5、具体和可衡量6、参与和…

Windows10为Git Bash添加文件传输命令rsync(详细图文配置)

文章目录 1. 安装git bash2. 下载所需要的4个包3. 下载解压包的软件4. 复制每个包下面的usr到git安装目录下4.1 所遇问题4.2 解决 5. 安装完成6. 需要注意 Windows上要使用 rsync命令上传或下载文件&#xff0c;需要使用git bash&#xff0c;git bash没有rsync&#xff0c;需要…

盘点2024年最新可用免费云服务器

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始使用云服务器来满足各种业务需求。云服务器作为云计算的核心服务之一&#xff0c;以其弹性扩展、按需付费等特点受到广泛关注。本文将为大家盘点2024年最新可用免费云服务器&#xff0c;助力大家轻松上云&#xf…

Problem #8 [Easy]

This problem was asked by Google. A unival tree (which stands for “universal value”) is a tree where all nodes under it have the same value. Given the root to a binary tree, count the number of unival subtrees. For example, the following tree has 5 un…

【c 语言】声明了一个指针,会给指针分配内存吗?

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

借力社交裂变,Xinstall助你实现用户快速增长

在数字化时代&#xff0c;社交裂变已成为品牌获取新用户、扩大影响力的关键手段。然而&#xff0c;如何有效利用社交裂变&#xff0c;实现用户快速增长&#xff0c;却是许多品牌面临的挑战。今天&#xff0c;我们将为大家介绍一个强大的社交裂变引擎——Xinstall&#xff0c;它…

状态模式【行为模式C++】

1.概述 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 2.结构 State(抽象状态类)&#xff1a;定义一个接口用来封装与上下文类的一个特定状态相关的行为&#xff0c;可以有一个或多…

【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

MoneyPrinterTurbo-利用AI大模型,一键生成高清短视频

MoneyPrinterTurbo-利用AI大模型&#xff0c;一键生成高清短视频 在今天的信息爆炸的时代&#xff0c;短视频已经成为最受欢迎的信息传递方式之一。无论是分享生活瞬间&#xff0c;还是传递重要信息&#xff0c;短视频都是最直观&#xff0c;最具影响力的手段。但是&#xff0…

量子城域网系列(四):几种典型的量子密钥分发网络组网方案

通过之前的文章&#xff0c;我们对点对点的量子保密通信网络有了直观的认识&#xff0c;也知道了量子保密通信系统就是利用量子密钥分发产生的无条件安全量子密钥作为系统安全性保证。所以在实际应用中&#xff0c;一个通信网络如果想实现量子加密&#xff0c;就需要建设量子密…

12-项目部署_持续集成

项目部署_持续集成 1 今日内容介绍 1.1 什么是持续集成 持续集成&#xff08; Continuous integration &#xff0c; 简称 CI &#xff09;指的是&#xff0c;频繁地&#xff08;一天多次&#xff09;将代码集成到主干 持续集成的组成要素 一个自动构建过程&#xff0c; 从…

【Linux C | 多线程编程】线程同步 | 总结条件变量几个问题

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

PHPStudy(小皮)切换PHP版本PDO拓展失效的问题

因为要看一个老项目&#xff0c;PHP版本在8.0以上会报错&#xff0c;只能切换到7.2&#xff0c;但又遇到了PDO没开启的问题。 PHPStudy上安装的PHP7.2是需要自己配置一下的&#xff0c;里面php.ini文件是空的&#xff0c;需要将php.ini-development改成php.ini&#xff0c;对于…

VSCode插件分享--免费的ER工具

首先在VSCode里面下载插件 再将插件导入后&#xff0c;添加文本修改后缀名&#xff08;将后缀名修改为.drawio&#xff09;就可以使用了

【个人博客搭建】(1)项目创建

1、打开vs2022&#xff0c;创建新项目。筛选一下条件&#xff0c;找到ASP.NET Core Web API 2、按照配置输入自己的项目名称和解决方案名称&#xff0c;以及项目路径 3、接下来就可以选择框架了&#xff0c;我这里选用net8版本&#xff0c;也可以选用net6&#xff0c;都是长期支…

【Sentinel的限流使用】⭐️SpringBoot整合Sentinel实现Api的限流

目录 前言 一、Sentinel下载 二、SpringBoot 整合 Sentinel 三、流控规则 章末 前言 小伙伴们大家好&#xff0c;上次使用OpenFeign时用到了 Hystrix实现熔断和限流的功能&#xff0c;但是发现该工具已经停止维护了&#xff0c;于是想到了Spring Cloud Alibaba开发的Sentin…

【企业动态】瑞芯微高级业务总监来访东胜物联,共探新能源汽车市场合作

近日&#xff0c;瑞芯微高级业务总监阙金珍一行来访东胜物联参观交流&#xff0c;并就深化合作进行讨论。 东胜物联与瑞芯微建有长期稳固的合作关系&#xff0c;基于RK3588、RK3399、RK3568等处理器&#xff0c;推出了多款嵌入式核心硬件产品&#xff0c;包括核心板、网关等&a…

【报错】TypeError: Cannot read property ‘meta‘ of undefined

&#x1f608;解决思路 首先这里很明显我们能看到是缺少该参数&#xff1a;meta。 但是经过查找后发现和该参数无关。 &#x1f608;解决方法 后来我上网搜了下&#xff0c;网上的回答大部分偏向于是package.json这个文件中的tabBar.list数组对象只有一条的问题。 网上的大…