面包屑-文件夹

2024-04-30 18:12
文章标签 文件夹 面包屑

本文主要是介绍面包屑-文件夹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.需求:

类似于 百度网盘、阿里云盘的 云文件夹管理功能
在这里插入图片描述

2.问题点

1.页面刷新 导致面包屑子级未持久化

2.浏览器的 前进、后退 ;面包屑未能 跳转到指定 子级

3.数据不同步问题

3.解决方法

1.后端提供 根据 id 查询面包屑 text 的 api【这里并没有提供】

2.建立自己的 map 库,并自行进行对比选择

3.监听浏览器 前进后退


《思路灵感》

当时一直没有很好的思路,周末在刷手机的时候,看到有一名up主在玩“红警”;他说:“我们前期先 用狗子 进行地图的探索”……

💡 那我们也可以让用户 建立自己的 map


【url 说明】

http://localhost:8080/#/cloud/myf 【根路径】

http://localhost:8080/#/cloud/myf?id=1782957532607504385&path=0,1782957532607504385【非跟路径,文件夹id 为 1782957532607504385 的目录下;path 路径为 0<根路径>,1782957532607504385<文件夹>】

核心代码

监听浏览器是否点击了前进或后退

【其中 getFileList 是选择性加载 table 中的数据,比如判断是 根路径<默认加载第一页数据>;子路径<根据id查询子数据第一页数据> 等】

window.addEventListener("popstate", async function (evt) {await getFileList()await checkRouter()
}, false);

这里只展示 checkRouter 的核心对比方法【详细参数说明参考方法下面】

/*** 面包屑核心对比 过程*/
const checkRouter = async () => {const pathTemplateDb = sessionStorage.getItem("pathTemplateDb")if (pathTemplateDb) {const pathTemplateDbObj = await JSON.parse(pathTemplateDb);const path = route.query.path ? route.query.path.split(',') : "0"const targetArray = []if (path === "0") {targetArray.push({path: "0", text: "全部文件", tag: "0"})} else {for (let i = 0; i < pathTemplateDbObj.length; i++) {for (let j = 0; j < path.length; j++)if (pathTemplateDbObj[i].tag === path[j]) {targetArray.push(pathTemplateDbObj[i])}}}pathArray.value = targetArray;sessionStorage.setItem('pathArray', JSON.stringify(pathArray.value))}
}

【说明 1 】pathArray 是记录 要显示的 面包屑的实时路径 数组

<el-breadcrumb separator="/"><el-breadcrumb-item v-for="(item, index) in pathArray" :key="item.path"@click.native.stop="handleClick(item, index)"><spanstyle="cursor: pointer">{{ item.text }}</span></el-breadcrumb-item>
</el-breadcrumb>
// 面包屑
const pathArray = ref([{path: '0', text: '全部文件', tag: "0"}
])

【说明 2】handleClick 是 点击面包屑 实现 路径的切换

核心代码

const handleClick = throttle(async (item, index) => {...const targetIndex = findIndexWithTag(pathArray.value, item.tag);if (item.tag !== "0") {// 子路由await router.push({path: route.path, query: {id: item.tag, path: item.path}})} else {// 根路由await router.push({path: route.path})}pathArray.value = pathArray.value.slice(targetIndex, targetIndex + 1)...
})// 寻找到 用户点击的 面包屑的值的索引值,并且后面的子路径都不要了
function findIndexWithTag(jsonData, flag) {for (var i = 0; i < jsonData.length; i++) {if (jsonData[i].tag === flag) {return i;}}return -1;
}

【说明 3】enterDirectory 是用户点击文件夹 进入文件夹的操作【这里其实就是 “狗子” 建立map 的过程 pathTemplateDb 就是用户自己的 map】

// 自己构建的 map 
const pathTemplateDb = ref([{path: '0', text: '全部文件', tag: "0"}
])const enterDirectory = throttle(async (row) => {...// 是文件夹const filterTagsArray = pathArray.value.map(item => item.tag)const targetPath = [...filterTagsArray, row.id].join(',')tempRouter.value = targetPath;pathArray.value.push({path: targetPath, text: row.fileName, tag: row.id})const target = JSON.parse(sessionStorage.getItem('pathTemplateDb')) || [{path: '0', text: '全部文件', tag: "0"}]//当用户首次进入文件夹的时候建立 map 《防止其中有重复的内容》if (!target.filter(_ => _.tag === row.id).length >= 1) {pathTemplateDb.value = [...target, {path: targetPath,text: row.fileName,tag: row.id}]sessionStorage.setItem('pathTemplateDb', JSON.stringify(pathTemplateDb.value))}// 数据持久化sessionStorage.setItem('pathArray', JSON.stringify(pathArray.value))...
})

小结

  1. 总得来说就是两个数组pathArray、pathTemplateDb、url 之间的操作,根据 url 中的 id 或 path 从 pathTemplateDb 查询对应数据 并 实时更改 pathArray
  2. 灵感来源于生活处处地方

这篇关于面包屑-文件夹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949563

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

如何将文件夹里的PHP代码放到一个文件里

find ./dir -name "*.php" -exec 'cat' {} \; > dir.out

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

node快速复制文件或文件夹,排除部分文件(node_modules)

const fs = require('fs')const path = require('path')/*** @description: 获取完整的文件路径* @param {*} url 路径* @return {*} 返回完整的文件路径*/const getPath = (url) => {return path.join(__dirname, url)}/*** @descr

Eclipse发布Maven项目到tomcat,无法加载到lib文件夹下的jar包

BMS 解决方法: 当我们发布web项目到tomcat时,访问地址时会报一个classnotfound的错误,但是eclipse中的项目中都已经添加了相应的类,有一种比较容易犯的错误是,你没有把额外所需的jar包加到tomcat中的lib文件夹中,在这里介绍一种在项目中直接添加jar包到lib目录下:  右键已创建的web项目——properties属性——点击Deployment Assem

Vue组件文件夹结构建议

全局通用组件 位于src/components。 注意与业务组件区分,全局通用组件更强调基础性。类似于一个UI框架里的各种Input、Button、Tab,只是在此处是你自己封装的。 建议风格 文件夹命名使用PascalBase风格一个文件夹代表一个组件组件使用index.vue导出 示例 目录结构 - src- components- SvgIcon- index.vue 使用

虚拟机ubuntu与主机共享文件夹

现在主机(windows)上新建一个共享文件夹 打开虚拟机 按下面操作打开共享文件夹   进入虚拟机的系统    cd /mnt/hgfs 如果报错 可以按下面的解决   挂载一下  sudo mount -t fuse.vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other 如果显示不存在这个文件夹  我们可以去自己创建一个 cd /mnt