首页 > 其他 > 详细

18.Vue技术栈开发实战-Tree组件实现文件目录-基础实现

时间:2020-07-07 01:18:28      阅读:124      评论:0      收藏:0      [点我收藏+]


技术分享图片
已经在路由里面创建了一个页面路由
技术分享图片
在api/data.js里面定义了两个方法, 一个是获取所有文件夹的列表,一个是获取所有文件的列表。
技术分享图片
在mock里面
技术分享图片
做了请求的拦截
技术分享图片
返回一个数组,里面包含10个对象,没个对象有四个字段。name、create_time、folder_id、id
技术分享图片

技术分享图片
先来获取第一个数据来测试下
技术分享图片
这是获取到的文件夹的列表。
技术分享图片
再来测试第二个的生成
技术分享图片
返回10个
技术分享图片
不能展开的就是文件,有子节点的就是文件夹。
技术分享图片
我们拿到的数据是一个偏平的一位数组,都在一个数组里,没有什么层级关系。
通过folder_id关联起来。需要把两个结果集组装起来。
技术分享图片
所以我们先要把这两个列表都要获取到。两个接口方法,同时去发请求。

第一种方法是这种嵌套的方式
技术分享图片
axios提供all方法,里面是一个数组,数组里面包含每一个请求。每一个元素都是一个promise。但是我们对axios做了封装了,所以我们不用all方法
技术分享图片
我们可以用原生的promise.all方法,给它传入一个数组,数组里面就是我们请求的返回promise的方法
技术分享图片
res返回的是一个数组,返回两个接口返回的数据。
技术分享图片
打印出数组,有两个元素。
技术分享图片
第一个元素就是文件夹列表
技术分享图片
第二个元素是文件列表
技术分享图片
lib/utils.js在这里面定义两个方法
技术分享图片
我们把文件放在对应的文件夹里,然后把文件夹按照层级关系,再一层层的拼接起来。
首先先把文件放到文件夹里,在js里面,数组是用的引用复制,它会把对象存储的地址赋值给变量,以后你在修改这个变量的时候,其实修改的还是这个地址所指的对象,为了避免我们修改传过来的this.folderList 我们在这里进行一下深拷贝。
把传递过来的文件夹对象和文件对象进行深拷贝。
技术分享图片
接下来去遍历文件夹列表。使用map方法,map方法是对一个数组进行映射的。
技术分享图片
获取到文件夹的id后,喜爱按获取文件夹列表的数组的数量 起名叫做index,因为我们遍历完一个folderItem,找到了哪些文件是属于这个文件夹的,那么这个文件就不可能再属于 别的文件夹了。所以说我们找到了这个文件的归属后,就应该把它从文件夹列表里面移除来。这样再遍历下一个文件夹的时候,再遍历这个文件列表,就不会在遍历已经有归属的文件了。能够减少一些遍历的开销。所以我们在遍历文件列表的同时,找到的就应该把它筛出来,那么这个文件列表在遍历的时候就会发生变化,所以我们做删除操作的话,应该是从文件列表的后面往前遍历,从后面往前删东西,不会影响到前面的东西,而你要从前面删的话,数组后面的元素 索引就会发生变化,所以这里我们取到这个文件列表的length作为 一开始的index
技术分享图片
然后做while循环。index的值先减1 再和0比较。大于等于0 就走里面的逻辑。length减去1 就是这个数组最后一个元素的索引。
技术分享图片
首先从最后一个元素开始遍历,如果当前文件的所属文件夹的id等于 上面的folderId那么就把这个元素删除,这里删除用的是splice把传入的参数index就是把这个元素从这个数组内删除,并返回一个数组,返回的数组就是你删除的元素,也就是把你删除的元素放在数组内返回了。
技术分享图片

技术分享图片
取数组的第0个就是删除的这个对象。
技术分享图片
获取到了删除的文件,那么还要做个处理。

iview的tree要求传入的数据是这种格式的 子元素 用children来做层级嵌套。
技术分享图片
tree的名称要求的字段是title。
技术分享图片
有时候我们后台返回的名称字段不一定就叫做title。例如这里我们返回的字段叫做name
技术分享图片

所以我们这里也要加上title的属性,就是文件名称
技术分享图片
接下来要把文件,放到文件夹里面。先判断有没有children属性,如果有就直接push进去。如果没有那么它的children属性就是个数组里面放着file单个对象。
技术分享图片
最后一定要把folderItem返回回去,它会你这个返回的folderItem组成一个新的数组。
技术分享图片
为了后面做一些定制化的东西,我们这个加个type属性,用来判断当前级别是文件夹还是文件。
技术分享图片
最后把这个数组 return 出去
技术分享图片
测试下我们封装的方法
技术分享图片
技术分享图片

技术分享图片
技术分享图片

把文件夹列表编程树状的,带有层级关系

在utils里面再定义一个方法,只需要传入文件夹列表。
还是先深拷贝一份。文件夹目录是有层级的,可以无限级别的往下嵌套文件夹。所以这里是个递归函数的用法。先来在内部定义一个方法。
技术分享图片
先内部定义一个方法,传递一个参数id
技术分享图片
定义一个空数组用来放我们的文件夹
技术分享图片
首先要遍历拷贝的文件夹列表folderList,如果当前的folder_id等于id 也就是传递进来的id值,然后就获取children,然后用concat合并children
技术分享图片
如果没有children。那么就让它等于获取到的children就可以了。
技术分享图片
把这个文件夹放到这个arr数组里。因为是他这个数组的子文件夹
技术分享图片
然后把这个arr返回回去, 在最外层调用这个handle
技术分享图片
第一级的文件夹的id为0,所以这里调用的地方我们也是写0
技术分享图片
这样就可以把一个扁平的文件夹,组装成一个树状了。
技术分享图片
再加一个title属性
技术分享图片

技术分享图片

输出查看
技术分享图片

技术分享图片
tree组件只要传入一个data就可以了
技术分享图片

技术分享图片
英文的是文件夹,汉字的是文件名
技术分享图片

自定义组件结构

tree允许我们传入render,自定义内容怎么展示
技术分享图片

技术分享图片

用的比较多的是第三个参数data。我们是要根据当前节点的数据来做渲染的。
技术分享图片
我们使用jsx的写法,因为这样比较的直观。看起来像html
技术分享图片
data就是当前节点的数据
技术分享图片
显示内容就是data.title
技术分享图片
div有个tree-item的属性,是我们自定义的
技术分享图片
里面也是可以展开的
技术分享图片
定义宽度,尽量款 但是又不会被挤到下一行。css3的属性calc 100%减去50像素技术分享图片
文件夹和文件区别开。
技术分享图片
如果是文件夹那么就渲染icon图标。这里注意icon是小写的icon。
技术分享图片
加个颜色
技术分享图片

技术分享图片

文件夹都带蓝色的图标
技术分享图片

优化样式

技术分享图片
icon加个样式 margin-right:10px;
技术分享图片
文件夹和文字的距离
技术分享图片

 

结束

 

18.Vue技术栈开发实战-Tree组件实现文件目录-基础实现

原文:https://www.cnblogs.com/wangjunwei/p/13258524.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!