使用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 相关文章推荐
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
Nov 20 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
Oct 21 Javascript
Js实现动态添加删除Table行示例
Apr 14 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
浅谈setTimeout 与 setInterval
Jun 23 Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 Javascript
JS中input表单隐藏域及其使用方法
Feb 13 Javascript
VUE实现日历组件功能
Mar 13 Javascript
在React中如何优雅的处理事件响应详解
Jul 24 Javascript
javascript 中select框触发事件过程的分析
Aug 01 Javascript
Vue实现星级评价效果实例详解
Dec 30 Javascript
javascript局部自定义鼠标右键菜单
Dec 08 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管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
php自定文件保存session的方法
2014/12/10 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
在Vue中使用mockjs代码实例
2020/11/25 Vue.js
python标准算法实现数组全排列的方法
2015/03/17 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
机器学习10大经典算法详解
2017/12/07 Python
Python对List中的元素排序的方法
2018/04/01 Python
python学生管理系统
2019/01/30 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
幼儿园国庆节活动方案
2014/02/01 职场文书
颁奖晚会主持词
2014/03/25 职场文书
服务质量承诺书
2014/03/27 职场文书
英文请假条
2014/04/11 职场文书
美术兴趣小组活动总结
2014/07/07 职场文书
大学生见习报告范文
2014/11/03 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
Python制作春联的示例代码
2022/01/22 Python