使用Vue实现一个树组件的示例


Posted in Javascript onNovember 06, 2020

HTML代码:

<!DOCTYPE html>
<html>
<head>
  <title>Vue Demo</title>

  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <style type="text/css">
    /* span样式 */
    .treeviewitem-span {
      font-size: 14px;
    }

    /* 箭头样式 */
    .treeviewitem-arrow-icon {
      margin-top: 3px;
      margin-left: 3px;
      margin-right: 3px;
      float: left;
      width: 0;
      height: 0;
      border-top-width: 6px;
      border-right-width: 0px;
      border-bottom-width: 6px;
      border-left-width: 6px;
      border-style: solid;
      border-color: transparent transparent transparent #666666;
      transform: rotate(0deg);
    }

    /* 90度旋转箭头样式 */
    .treeviewitem-arrow-icon90 {
      margin-top: 3px;
      margin-left: 3px;
      margin-right: 3px;
      float: left;
      width: 0;
      height: 0;
      border-top-width: 6px;
      border-right-width: 0px;
      border-bottom-width: 6px;
      border-left-width: 6px;
      border-style: solid;
      border-color: transparent transparent transparent #666666;
      transform: rotate(90deg);
    }

    /* 模板隐藏 */
    template {
      display: none;
    }
  </style>

  <script type="text/javascript" src="vue.js"></script>
  <script type="text/javascript">

  </script>
</head>
<body>
  <!-- treeviewitem模板 -->
  <template id="treeviewitem">
    <div>
      <div style="background-color:transparent; cursor:default; height:25px;"><div v-on:click="expand" style="width:16px; height:16px; float:left; background-color:transparent;"><span v-bind:class="[self.expand ? 'treeviewitem-arrow-icon90':'treeviewitem-arrow-icon']" v-if="isLeaf"></span></div><input type="checkbox" v-on:click="checkboxClick" v-model="self.selected" /><span v-on:click="itemClick" class="treeviewitem-span">{{ self.name }}</span></div>
      <div v-if="self.expand" v-for="item in items" style="margin-left:20px;">
        <treeviewitem v-bind:items="item.items" v-bind:self="item"></treeviewitem>
      </div>
    </div>
  </template>

  <!-- treeview模板 -->
  <template id="treeview">
    <div>
      <div v-for="item in items">
        <treeviewitem v-bind:items="item.items" v-bind:self="item"></treeviewitem>
      </div>
    </div>
  </template>

  <div id="app">
    <!-- 使用treeview组件 -->
    <treeview v-bind:items="items"></treeview>
    <br />
    <button onclick="showSelectedResult()">勾选结果</button>
  </div>

  <script type="text/javascript">
    //定义treeviewitem组件
    Vue.component('treeviewitem', {
      props: ['items', 'self'],
      template: '#treeviewitem',
      methods: {
        itemClick: function (d) {
          alert("您单击了节点:" + this.self.name);
        },
        checkboxClick: function (e) {
          var checkChild;
          checkChild = function (items, checked) {
            for (var i = 0; i < items.length; i++) {
              var item = items[i];
              item.selected = checked;
              if (item.items) {
                checkChild(item.items, checked)
              }
            }
          };

          if (e.target.checked) {
            checkChild(this.items, true);
          } else {
            checkChild(this.items, false);
          }
        },
        expand: function (e) {
          if (this.self.expand) {
            this.self.expand = false;
          } else {
            this.self.expand = true;
          }
        }
      },
      computed: {
        isLeaf: function () {
          if (this.items && this.items.length > 0) {
            return true;
          }
          return false;
        }
      }
    });

    //定义treeview组件
    Vue.component('treeview', {
      props: ['items'],
      template: '#treeview'
    });

    //定义vm
    var vm = new Vue({
      el: '#app',
      methods: {
        /**
         * @description 获取勾选结果
         */
        getSelected: function (items) {
          if (!items) items = this.items;

          var result = [];
          for (var i = 0; i < items.length; i++) {
            var item = items[i];
            if (item.selected) {
              result.push(item.name);
            }
            if (item.items) {
              var childSelected = this.getSelected(item.items);
              for (var k = 0; k < childSelected.length; k++) {
                result.push(childSelected[k]);
              }
            }
          }
          return result;
        }
      },
      data: {
        items: [
          {
            name: '条目1',
            expand: true,
            selected: false,
            items: [
              {
                name: '条目11',
                expand: true,
                selected: false,
                items: [
                  {
                    name: '条目111',
                    expand: true,
                    selected: true,
                  }
                ]
              },
              {
                name: '条目12',
                expand: false,
                selected: false,
                items: [
                  {
                    name: '条目121',
                    expand: true,
                    selected: false,
                  },
                  {
                    name: '条目122',
                    expand: true,
                    selected: false,
                    items: [
                      {
                        name: '条目1221',
                        expand: true,
                        selected: false
                      },
                      {
                        name: '条目1222',
                        expand: true,
                        selected: false
                      }
                    ]
                  }
                ]
              },
              {
                name: '条目13',
                expand: true,
                selected: false
              }
            ]
          },
          {
            name: '条目2',
            expand: true,
            selected: false
          },
          {
            name: '条目3',
            expand: true,
            selected: false,
            items: [
              {
                name: "条目31",
                expand: true,
                selected: false
              }
            ]
          }
        ]
      }
    })

    //显示勾选结果
    function showSelectedResult() {
      var selected = vm.getSelected();
      alert("您勾选了:" + selected.join(', '));
    }
  </script>
</body>
</html>

效果图:

使用Vue实现一个树组件的示例

以上就是使用Vue实现一个树组件的示例的详细内容,更多关于vue 实现树组件的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
ArrayList类(增强版)
Apr 04 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
Sep 20 Javascript
JS中showModalDialog 的使用解析
Apr 17 Javascript
javascript 得到文件后缀名的思路及实现
May 09 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
Dec 30 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
动态加载jQuery的方法
Jun 16 Javascript
关于JS 预解释的相关理解
Jun 28 Javascript
使用Bootstrap美化按钮实例代码(demo)
Feb 03 Javascript
JavaScript 数组的进化与性能分析
Sep 18 Javascript
详解vue.js之props传递参数
Dec 12 Javascript
Vue事件修饰符native、self示例详解
Jul 09 Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 #Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
Nov 04 #Javascript
vue 判断页面是首次进入还是再次刷新的实例
Nov 05 #Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 #Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
Nov 05 #Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
Nov 05 #Javascript
如何利用vue实现波谱拟合详解
Nov 05 #Javascript
You might like
PHP与已存在的Java应用程序集成
2006/10/09 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
python字符串常用方法
2018/06/14 Python
wxPython的安装与使用教程
2018/08/31 Python
详解Python装饰器
2019/03/25 Python
Python多线程多进程实例对比解析
2020/03/12 Python
python小白切忌乱用表达式
2020/05/29 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
Python自省及反射原理实例详解
2020/07/06 Python
基于opencv实现简单画板功能
2020/08/02 Python
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
什么是测试驱动开发(TDD)
2012/02/15 面试题
大学毕业生通用自我评价
2014/01/05 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
致运动员加油稿
2015/07/21 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js
Js类的构建与继承案例详解
2021/09/15 Javascript