vue文件树组件使用详解


Posted in Javascript onMarch 29, 2018

本文实例为大家分享了vue文件树组件的实现方法,供大家参考,具体内容如下

本文主要是分析vue官方仓库里的文件树组件[vue github]

demo可以查看 https://codepen.io/shayminsky21/pen/xXwxgm

首先是html模板:

<li>
  <div
   //文件夹加粗表示
   :class="{bold: isFolder}" 
   //处理单击事件 打开闭合文件列表            
   @click="toggle"  
   //处理双击事件 双击子文件,子文件属性变为文件夹               
   @dblclick="changeType">  
   //显示文件名      
   {{model.name}}
  //若是文件夹的话则显示[+]来控制文件夹的开关闭合
   <span v-if="isFolder">[{{open ? '-' : '+'}}]</span>
  </div>
  <ul v-show="open" v-if="isFolder">
  //利用v-for显示子文件列表,通过递归使用item组件来完成文件树
   <item
   class="item"
   v-for="model in model.children"
   :model="model">
   </item>
   //增加一个+标记,单击可以增加子文件
   <li class="add" @click="addChild">+</li>
  </ul>
</li>

接下来是组件部分的源码:

Vue.component('item', {
 template: '#item-template',
 props: {
 model: Object //将文件数据通过props传入
 },
 data: function () {
 return {
  open: false  //open表示文件夹闭合状态
 }
 },
 computed: {
 isFolder: function () {
  return this.model.children &&
  this.model.children.length
 }
 }, //计算对象是否有子节点并且子节点数大于0来判断是否是文件夹
 methods: {
 toggle: function () {
  if (this.isFolder) {
  this.open = !this.open
  }
 },    //控制文件夹闭合的方法 单击触发改变open
 changeType: function () {
  if (!this.isFolder) {
  Vue.set(this.model, 'children', [])
  this.addChild()
  this.open = true
  }
 }, //双击触发,通过给文件增加子节点来使文件属性变成文件夹
 addChild: function () {
  this.model.children.push({
  name: 'new stuff'
  })  //点击文件夹里的+节点触发 为文件夹添加一个新文件
 }   
 }
})

所以设计思路就是通过判断对象是否有子节点来决定是文件夹还是文件,然后通过递归复用<item>组件来展示文件树的效果。

最后是传入组件的数据格式:

var data = {
 name: 'My Tree',
 children: [
 { name: 'hello' },
 { name: 'wat' },
 {
  name: 'child folder',
  children: [
  {
   name: 'child folder',
   children: [
   { name: 'hello' },
   { name: 'wat' }
   ]
  },
  { name: 'hello' },
  { name: 'wat' },
  {
   name: 'child folder',
   children: [
   { name: 'hello' },
   { name: 'wat' }
   ]
  }
  ]
 }
 ]
}

大家可以根据这个基本的结构继续拓展文件树的功能和展示效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 浮点运算精度问题分析与解决
Mar 26 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
Jun 16 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
require简单实现单页应用程序(SPA)
Jul 12 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
vue.js全局API之nextTick全面解析
Jul 07 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
Sep 20 Javascript
浅谈Node.js之异步流控制
Oct 25 Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
May 14 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
vue全局组件与局部组件使用方法详解
Mar 29 #Javascript
javascript实现文件拖拽事件
Mar 29 #Javascript
vue 父组件调用子组件方法及事件
Mar 29 #Javascript
vue.js element-ui tree树形控件改iview的方法
Mar 29 #Javascript
Vue 源码分析之 Observer实现过程
Mar 29 #Javascript
vue 实现全选全不选的示例代码
Mar 29 #Javascript
Angular开发实践之服务端渲染
Mar 29 #Javascript
You might like
PHP文本操作类
2006/11/25 PHP
开发大型 PHP 项目的方法
2007/01/02 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
PHP 图片上传实现代码 带详细注释
2010/04/29 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
js和C# 时间日期格式转换的简单实例
2016/05/28 Javascript
js实现按钮控制带有停顿效果的图片滚动
2016/08/30 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
初学vue出现空格警告的原因及其解决方案
2019/10/31 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python常用的日期时间处理方法示例
2015/02/08 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Python计算已经过去多少个周末的方法
2015/07/25 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python使用原始套接字发送二层包(链路层帧)的方法
2019/07/22 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
Python如何实现定时器功能
2020/05/28 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
施工安全协议书
2016/03/22 职场文书