vue文件树组件使用详解

作者:shayminsky 时间:2024-05-09 09:53:52 

本文实例为大家分享了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' }
  ]
 }
 ]
}
]
}

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

来源:https://blog.csdn.net/shayminsky/article/details/78540100

标签:vue,文件树,组件
0
投稿

猜你喜欢

  • python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)

    2024-01-13 15:19:57
  • 在 Python 中接管键盘中断信号的实现方法

    2022-11-25 15:14:55
  • 细化解析:怎样把你的MySQL完全中文化

    2008-12-19 17:48:00
  • django请求返回不同的类型图片json,xml,html的实例

    2021-05-17 10:03:23
  • asp如何对文件进行操作?

    2009-11-20 18:31:00
  • Python项目 基于Scapy实现SYN泛洪攻击的方法

    2023-01-15 01:34:30
  • python定时任务apscheduler的详细使用教程

    2023-03-30 07:48:05
  • Flask实现跨域请求的处理方法

    2022-03-18 08:19:07
  • Python语言实现SIFT算法

    2022-12-30 17:58:14
  • 碰到MySQL无法启动1067错误问题解决方法

    2024-01-18 09:16:47
  • 在JavaScript中获取请求的URL参数

    2024-04-25 13:08:43
  • python flask项目打包成docker镜像发布的过程

    2021-06-28 17:38:21
  • Python全栈之学习JS(1)

    2021-09-30 03:43:23
  • 音频处理 windows10下python三方库librosa安装教程

    2023-10-12 08:29:50
  • MYSQL教程:检查数据表和修复数据表

    2009-03-11 15:24:00
  • MSSQL存储过程解秘过程全析

    2010-07-05 08:49:00
  • GO语言基本数据类型总结

    2024-02-06 08:14:27
  • 解决vue请求接口第一次成功,第二次失败问题

    2023-07-02 16:59:59
  • Tensorflow 多线程设置方式

    2021-09-29 21:53:50
  • JDBC下Idea添加mysql-jar包的详细过程

    2024-01-20 10:58:18
  • asp之家 网络编程 m.aspxhome.com