vue如何写组织架构、文件夹类似这样的树结构?

源码地址

用vue写了一个组织树结构,但是不清楚怎么实现展开折叠。
样式结构都已经写好了,
我的思路:

  1. 展开折叠通过类名 active 来控制
  2. 当前状态(背景会高亮)通过类名 curr 来控制

但是我现在被卡住了,不清楚点击的时候如何动态添加这两个类名

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>树结构练习</title>
    <link rel="stylesheet" href="css/iconfont/iconfont.css">
    <link rel="stylesheet" href="css/tree.css">
  </head>
  <body>
    <div id="treeDemo" class="tree">
      <!-- 公司名称 开始 -->
      <a class="company-name" href="javascript:;">
        <i class="iconfont icon-arrow_u"></i>
        <span>{{tree.data.name}}</span>
        <em>(0人)</em>
      </a>
      <!-- 公司名称 结束 -->

      <!-- 部门列表 开始 -->
      <my-tree class="tree-list" :model="tree.data.children"></my-tree>
      <!-- 部门列表 结束 -->
    </div>
    <script type="text/x-template" id="treeTemplate">
      <ul>
        <li v-for="(item, index) in model">
          <!-- 展开折叠通过类名:active来控制 -->
          <!-- 当前高亮位置通过类名:curr来控制 -->
          <a href="javascript:;" v-bind:class="{active: true, curr: false}" v-on:click="debug()">
            <i class="iconfont" v-if="item.children"></i>
            <span>{{item.name}}</span>
            <em>(xxx人)</em>
          </a>
          <my-tree class="inner-list" v-if="item.children" :model="item.children"></my-tree>
        </li>
      </ul>
    </script>
    <script src="https://unpkg.com/vue"></script>
    <script src="js/treeData.js"></script>
    <script src="js/treeComponent.js"></script>
    <script>
      new Vue({
        el: '#treeDemo',
        data: {
          tree: tree,
        }
      });
    </script>
  </body>
</html>

treeComponent.js

Vue.component('my-tree', {
  template: '#treeTemplate',
  props: ['model'],
  data: function(){
    return {
      //
    };
  },
  computed: {
    //
  },
  methods: {
    debug: function(){
      console.log("点击了");
    }
  }
});

treeData.js

var tree = {
  data: {
    name: '北京阿里巴巴有限公司',
    children:[
      {
        name:"行业应用部",
        children:[
          {
            name: "前端",
            children:[
              {
                name: "官网"
              },
              {
                name: "EOS"
              }
            ]
          },
          {
            name: "Java",
            children:[
              {
                name: "实习1"
              },
              {
                name: "实习2"
              },
              {
                name: "实习3"
              }
            ]
          }
        ]
      },
      {
        name:"产品部",
        children:[
          {
            name:"UI"
          },
          {
            name:"测试"
          },
          {
            name:"产品经理"
          }
        ]
      }
    ]
  }
};

阅读 4.8k
3 个回答

可以在组件内部通过一个变量配合v-show来实现展开和折叠,可以参考我以前的博客vue递归组件

饿了吗公司出了一个基于vue2的组件库叫element-ui,很多东西都封装好了,建议你使用这个组件库。

我最近刚好在做产品的时候用到企业组织架构树这一块,我的使用场景比楼主的数据格式要复杂一些,可以满足组织架构的无限极递归 https://segmentfault.com/l/15...
展开合并的控制,只需要给每个节点数据扩展一个是否展开属性(用vue.$set方法)为节点数据对象扩展,因$set扩展的对象属性是响应式的,会驱动页面效果实时变化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题