【前端开发】PrimeVue:基于Tree树控件的选择树节点事件完善

前言

  • 在PrimeVue中的Tree组件中,只能默认点击箭头,执行树节点的展开和折叠
  • 在本文件中,进一步处理成:当选择当前根目录时,直接就可进行树节点的展开和折叠

1. 页面组件

  • expandAll ( ) :展开所有树节点
  • collapseAll ( ) :关闭所有树节点
  • :value=“nodes”:树数据
  • v-model:expandedKeys=“expandedKeys”:控制树的展开和折叠
  • #default=“slotProps”:自定义模板(显示树节点的标签文本)
  • getColor ( level ):根据树的层次渲染文本颜色
<template>
  <div class="left-menu">
    <Loading ref="loading" :isLoading="isLoading"></Loading>
    <div class="btn-group">
      <Button type="button" icon="pi pi-plus" label="展开" @click="expandAll"/>
      <Button type="button" icon="pi pi-minus" label="折叠" @click="collapseAll"/>
    </div>

    <Tree
        :value="nodes"
        v-model:expandedKeys="expandedKeys"
        class="tree"
        @nodeSelect="onNodeSelect"
    >
      <template #default="slotProps">
        <div :style="{fontWeight:'bold', color: getColor(slotProps.node.level)}">
          {{ slotProps.node.label }}
        </div>
      </template>
    </Tree>
  </div>
</template>

2. 引入Tree组件

import {ref} from "vue";
import Button from "primevue/button";
import Tree from "primevue/tree";

3. 初始化node对象

const nodes = ref(null);
//控制节点(展开/折叠)
const expandedKeys = ref({});

let isLoading = true;
window.onload = function () {
  isLoading = true
  fetchData()
}

// 初始化数据
async function fetchData() {
  try {
    const response = await axios.get('请求数据URL');
    //根目录
    const directoryTree = response.data[0];
    //设置节点层级再赋予node值
    const treeWithLevels = addLevelsToTreeNodes(directoryTree);
    nodes.value = [treeWithLevels];
	//渲染目录节点数据
    pickDirectory(response.data)
    // 关闭所有树节点
    expandedKeys.value = {};
  } catch (e) {
    console.error(e)
  } finally {
    isLoading = false;
  }
}

// 添加层级信息到节点
function addLevelsToTreeNodes(node, level = 0) {
  node.level = level;
  if (node.children) {
    node.children.forEach(child => addLevelsToTreeNodes(child, level + 1));
  }
  return node;
}

4. 按钮事件及层次颜色函数

//展开全部树节点
const expandAll = () => {
  for (let node of nodes.value) {
    expandNode(node);
  }
  expandedKeys.value = {...expandedKeys.value};
};

//折叠全部树节点
const collapseAll = () => {
  expandedKeys.value = {};
};

// 展开全部树目录
const expandNode = (node) => {
  if (node.children && node.children.length) {
    expandedKeys.value[node.key] = true;
    // 展开子树节点
    for (let child of node.children) {
      expandNode(child);
    }
  }
};

const getColor = (level) => {
  const colors = ['#00a65a', '#3c8dbc', '#f39c12', '#00c0ef', '#e67ad2'];
  return level > colors.length ? '#d2d6de' : colors[level];
}

5. 选择当前树目录事件

//选择当前树目录
const onNodeSelect = async (node) => {
  console.log(node);
  if (node) {
    // 展开/折叠当前树目录
    expandedKeys.value[node.key] = !expandedKeys.value[node.key];
      } catch (e) {
        console.error(e)
      }
    }
  }
};

相关推荐

  1. 实现 Trie (前缀)

    2024-04-29 02:28:03       60 阅读
  2. d3tree,点击动态加载,默认展开三层

    2024-04-29 02:28:03       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 02:28:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 02:28:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 02:28:03       82 阅读
  4. Python语言-面向对象

    2024-04-29 02:28:03       91 阅读

热门阅读

  1. 数学专题1 - 素数筛(2)

    2024-04-29 02:28:03       26 阅读
  2. C语言总结二:分支与循环(压缩版)

    2024-04-29 02:28:03       28 阅读
  3. C++_跨平台编译_cmakefile中_添加内容

    2024-04-29 02:28:03       35 阅读
  4. 基于Qt的二维码生成与识别技术详解

    2024-04-29 02:28:03       35 阅读
  5. LeetCode 题目 62:不同路径【python】

    2024-04-29 02:28:03       31 阅读
  6. 设置消息边界的方法有哪几种?

    2024-04-29 02:28:03       32 阅读
  7. react 实现自动创建api 请求文件

    2024-04-29 02:28:03       32 阅读
  8. 简易TCP客户端和服务器端通信

    2024-04-29 02:28:03       31 阅读
  9. vue3中如何父组件中使用弹框,子组件中关闭弹框

    2024-04-29 02:28:03       29 阅读
  10. BIO NIO AIO有什么区别?

    2024-04-29 02:28:03       25 阅读