Vue.js递归组件实现组织架构树和选人功能

下面是关于 Vue.js 递归组件实现组织架构树和选人功能的完整攻略。

什么是 Vue.js 递归组件

Vue.js 的递归组件是指在组件的模板中可以调用组件自身的一种特殊组件。通过使用递归组件,可以在联动结构中轻松地构建无限级别的嵌套组件和树形结构。

实现组织架构树和选人功能的步骤

  1. 数据结构的设计

组织架构树通常是按照树形结构设计的,所以在 Vue.js 中的数据结构也需要按照这种方式来组织,可以使用对象和数组进行组合。

假设一个公司的组织架构如下:

公司
├── 董事会
├── 行政部
│   ├── 人力资源部
│   └── 行政管理部
├── 营销部
└── 生产部
    ├── 研发部
    └── 工程部

可以使用以下方式来组织数据结构:

{
  name: '公司',
  children: [
    {
      name: '董事会',
      children: []
    },
    {
      name: '行政部',
      children: [
        {
          name: '人力资源部',
          children: []
        },
        {
          name: '行政管理部',
          children: []
        }
      ]
    },
    {
      name: '营销部',
      children: []
    },
    {
      name: '生产部',
      children: [
        {
          name: '研发部',
          children: []
        },
        {
          name: '工程部',
          children: []
        }
      ]
    }
  ]
}
  1. 递归组件的使用

在 Vue.js 中,可以通过递归组件来创建树形结构。递归组件通过在组件模板中调用自身组件来实现无限级别的嵌套。

具体的操作步骤如下:

首先,在组件中注册当前组件的名称:

Vue.component('tree', {
  // ...
})

然后,在模板中使用该组件,并在其中通过 v-if 判断 children 是否有子节点,若有,则递归渲染,否则表示该节点为叶子节点,直接显示名称:

<template>
  <ul>
    <li>
      {{ node.name }}
      <ul v-if="node.children && node.children.length > 0">
        <tree v-for="child in node.children" :node="child" :key="child.name"></tree>
      </ul>
    </li>
  </ul>
</template>

以上代码中,使用 v-if 判断 node.children 是否存在,并且该数组的长度是否大于 0,如果条件成立,则递归调用该组件并传递子节点的数据。

  1. 选人功能的实现

在组织架构树的基础上,还可以增加选人功能。选人功能通常包括两个部分:

  • 点击组织架构树中的某个节点,可以选择该节点下的所有人员;
  • 点击确定按钮,可以将所选人员返回给父组件。

可以通过监听点击事件和触发自定义事件来实现选人功能。具体的实现步骤如下:

首先,在组件中声明一个 selected 变量,用于存放选择的人员:

data() {
  return {
    selected: []
  }
}

然后,对树形结构中的每个节点使用 v-bind 指令来绑定 click 事件,同时,在事件处理函数中,触发自定义事件并将节点的数据传递给父组件:

<template>
  <ul>
    <li v-bind:class="{ selected: selected.includes(node) }" v-on:click="handleClick">
      {{ node.name }}
      <ul v-if="node.children && node.children.length > 0">
        <tree v-for="child in node.children" :node="child" :key="child.name" v-on:select="handleSelect"></tree>
      </ul>
    </li>
  </ul>
</template>

其中,selected.includes(node) 用于判断当前节点是否已被选中,如果已选中则加上 selected 类,否则不加。

接着,在 handleSelect 方法中,对 selected 数组进行操作,将选中的节点存储到 selected 中:

methods: {
  handleClick() {
    this.$emit('select', this.node);
  },
  handleSelect(node) {
    this.selected.push(node);
  }
}

最后,在父组件中调用该组件时,监听自定义事件 select,获取选中的节点数据并将其保存到父组件中:

<template>
  <tree :node="data" v-on:select="handleSelect"></tree>
</template>

<script>
  export default {
    data() {
      return {
        data: {...},  // 组织架构树的数据结构
        selected: []  // 保存选中的节点数据
      }
    },
    methods: {
      handleSelect(node) {
        this.selected.push(node);
      }
    }
  }
</script>

示例说明

示例一:实现组织架构树

下面是一个简单的实例,演示了如何使用递归组件实现组织架构树:

<template>
  <div>
    <tree :node="data"></tree>
  </div>
</template>

<script>
  Vue.component('tree', {
    props: ['node'],
    template: `
      <ul>
        <li>{{ node.name }}</li>
        <ul v-if="node.children && node.children.length > 0">
          <tree v-for="child in node.children" :node="child" :key="child.name"></tree>
        </ul>
      </ul>
    `
  });

  export default {
    data() {
      return {
        data: {
          name: '公司',
          children: [
            {
              name: '董事会',
              children: []
            },
            {
              name: '行政部',
              children: [
                {
                  name: '人力资源部',
                  children: []
                },
                {
                  name: '行政管理部',
                  children: []
                }
              ]
            },
            {
              name: '营销部',
              children: []
            },
            {
              name: '生产部',
              children: [
                {
                  name: '研发部',
                  children: []
                },
                {
                  name: '工程部',
                  children: []
                }
              ]
            }
          ]
        }
      }
    }
  }
</script>

示例二:实现组织架构树和选人功能

下面是一个复杂一些的实例,演示了如何实现组织架构树和选人功能:

<template>
  <div>
    <button v-on:click="handleOk">确定</button>
    <tree :node="data" v-on:select="handleSelect"></tree>
  </div>
</template>

<script>
  Vue.component('tree', {
    props: ['node'],
    data() {
      return {
        selected: []
      }
    },
    template: `
      <ul>
        <li v-bind:class="{ selected: selected.includes(node) }" v-on:click="handleClick">
          {{ node.name }}
          <ul v-if="node.children && node.children.length > 0">
            <tree v-for="child in node.children" :node="child" :key="child.name" v-on:select="handleSelect"></tree>
          </ul>
        </li>
      </ul>
    `,
    methods: {
      handleClick() {
        this.$emit('select', this.node);
      },
      handleSelect(node) {
        this.selected.push(node);
      }
    }
  });

  export default {
    data() {
      return {
        data: {
          name: '公司',
          children: [
            {
              name: '董事会',
              children: []
            },
            {
              name: '行政部',
              children: [
                {
                  name: '人力资源部',
                  children: [
                    { name: '张三' },
                    { name: '李四' }
                  ]
                },
                {
                  name: '行政管理部',
                  children: [
                    { name: '王五' },
                    { name: '赵六' }
                  ]
                }
              ]
            },
            {
              name: '营销部',
              children: [
                { name: '宋江' },
                { name: '吴用' }
              ]
            },
            {
              name: '生产部',
              children: [
                {
                  name: '研发部',
                  children: [
                    { name: '小明' }
                  ]
                },
                {
                  name: '工程部',
                  children: [
                    { name: '小红' }
                  ]
                }
              ]
            }
          ]
        },
        selected: []
      }
    },
    methods: {
      handleSelect(node) {
        if (node.children && node.children.length > 0) {
          return;
        }
        this.selected.push(node);
      },
      handleOk() {
        console.log(this.selected);  // 打印选中的人员信息
      }
    }
  }
</script>

在这个例子中,首先定义了一个 selected 数组来保存选中的人员信息。然后,对 tree 组件中的每个节点绑定 click 事件,并触发 select 自定义事件,将节点数据传递给父组件。

在父组件中,监听 select 自定义事件,如果选择的是叶子节点(即选中的是人员),则将节点数据保存到 selected 数组中。当点击确定按钮时,打印选中的人员信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue.js递归组件实现组织架构树和选人功能 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • visualstudio怎么调整输出继承对象的大小?

    调整Visual Studio中输出继承对象大小的方法有两种。下面将对这两种方法进行详细的讲解。 方法一:使用调试窗口查看继承对象 在代码中打上断点,使程序停在需要查看的继承对象的位置。 在 Visual Studio 工具栏中选择 “调试” -> “窗口” -> “快速监视” 或使用快捷键 “Shift+Ctrl+Q” 打开窗口。 在快速监视窗…

    other 2023年6月27日
    00
  • navicatpremium12安装及激活

    以下是关于“navicat premium 12安装及激活”的完整攻略,包括基本概念、使用方法和两个示例。 基本概念 Navicat Premium 12是一款功能强大的数据库管理工具,支持多种数据库类型,包括MySQL、MariaDB、Oracle、SQL、PostgreSQL等。安装和激活Navicat Premium 12需要一定的操作步骤,本攻略将为…

    other 2023年5月7日
    00
  • pid文件的作用

    pid文件的作用 在UNIX和类UNIX操作系统中,Pid文件是一种描述进程ID(PID)的文件。当一个进程启动时,操作系统会为其分配一个唯一的PID,将其写入pid文件中,以便其他的进程和程序可以通过该文件获取该进程的PID,实现进程的管理、监控等功能。 在类UNIX系统中,例如Linux和macOS,pid文件一般被存放在/var/run目录下。pid文…

    其他 2023年3月29日
    00
  • MIP经典问题:旅行商问题 (traveling salesman problem)

    MIP经典问题:旅行商问题 (Traveling Salesman Problem) 旅行商问题(Traveling Salesman Problem,缩写为TSP)是一个经典的组合优化问题,它的目标是在已知的一组城市之间寻找一条路径,使得旅行商可以最小化旅行的总路程并回到出发城市。 问题描述 问题的输入是一组城市,这些城市之间的距离是已知的。旅行商需要从出…

    其他 2023年3月28日
    00
  • 苹果iOS9.3.3正式版官方固件下载地址汇总

    苹果iOS9.3.3正式版官方固件下载地址汇总攻略 苹果iOS9.3.3正式版官方固件是一款用于iPhone、iPad和iPod Touch设备的操作系统。本攻略将详细介绍如何获取iOS9.3.3正式版官方固件的下载地址。 步骤一:访问苹果官方网站 首先,打开您的浏览器,并访问苹果官方网站(https://www.apple.com)。 步骤二:导航至支持页…

    other 2023年8月4日
    00
  • 手把手教你使用python抓取qq音乐数据

    当然,我很乐意为您提供有关“使用Python抓取QQ音乐数据”的完整攻略。以下是详细的步骤和两个示例: 1 使用Python抓取QQ音乐数据 Python是一种流行的编程语言,可以用于抓取网站数据。在本攻略中,我们将使用Python抓取QQ音乐数据。 2 抓取QQ音乐数据的步骤 以下是使用Python抓取QQ音乐数据的步骤: 2.1 安装requests和b…

    other 2023年5月6日
    00
  • 增强Linux内核中访问控制安全的方法

    当访问控制不足时,攻击者可能会利用系统漏洞或者僵尸进程进行系统内部攻击。在Linux系统中,内核是最基础也是最核心的部分。因此,Linux内核的安全性至关重要。本文将讲述如何增强Linux内核中的访问控制安全。 1.使用命名空间隔离系统资源 使用命名空间技术隔离系统资源,能够使容器得到隔离并提供安全的容器内环境。在Linux3.8版本中,引入了六种命名空间类…

    other 2023年6月27日
    00
  • JS iFrame加载慢怎么解决

    那么接下来我将从以下几个方面详细讲解“JS iFrame 加载慢问题”的解决方案。 1. 优化加载页面 iFrame 加载缓慢一般是由于加载页面过大或者页面中包含大量资源导致的。因此,可以从优化加载页面的角度入手来解决这个问题。下面是几种具体的优化方案: 1.1 减小页面体积 尽量减小 iFrame 加载页面的体积,去掉不必要的 CSS 和 JS 文件,并对…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部