面包屑-文件夹

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)">
            <span
                style="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. 灵感来源于生活处处地方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/584928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】如何打开ZIP格式的压缩文件?

压缩文件格式的种类比较多&#xff0c;ZIP是最常见的压缩格式之一。那收到ZIP压缩文件&#xff0c;要如何打开呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 方法一&#xff1a;使用系统自带的解压缩功能 很多电脑操作系统都内置了解压缩功能&#xff0c;并且支持大…

Matlab|含sop的33节点配电网优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序以IEEE33节点为例&#xff0c;分析含sop的配电网优化&#xff0c;包括sop有功约束、无功约束和容量约束&#xff0c;非线性部分通过转换为旋转锥约束进行编程&#xff0c;并且包括33节点配电网潮流及对应…

微信小程序个人中心、我的界面(示例四)

微信小程序个人中心、我的界面&#xff0c;九宫格简单布局&#xff08;示例四&#xff09; 微信小程序个人中心、我的界面&#xff0c;超简洁的九宫格界面布局&#xff0c;代码粘贴即用。更多微信小程序界面示例&#xff0c;请进入我的主页哦&#xff01; 1、js代码 Page({…

《深入解析WIndows操作系统》第9章读书笔记

1、闪存类型&#xff1a;常见的闪存类型有NOR和NAND。NOR闪存在操作上最接近RAM&#xff0c;它的每个字节都可以被独立地寻址&#xff0c;而NAND闪存则被组织成以块为单位&#xff0c;就像磁盘一样。NOR类型的闪存用来设计保存计算机主板上的BIOS&#xff0c;而NAND类型的闪存被…

【哈希】Leetcode 217. 存在重复元素

题目讲解 217. 存在重复元素 算法讲解 使用set集合完成元素的存储&#xff0c;当我们将当前元素插入到集合单中&#xff0c;如果insert的返回值的pair.second等于false说明当前元素已经存在&#xff0c;反之元素在集合中存在 class Solution { public:bool containsDuplica…

【触摸案例-手势解锁案例-九宫格 Objective-C语言】

一、手势解锁案例,九宫格,我们先来分析一下怎么实现: 首先呢,我们先来运行一下, 这一块儿,上面的这九个东西,肯定是要有一个九宫格的一个算法的问题,然后呢,上边的这九个小圆圈儿,这是什么东西,Button,为什么是Button,因为可以点,是吗,就因为这个?实际上,你用…

UE5像素流部署以及多实例部署(兼容ue4)

像素流部署请看我之前的文章就行&#xff0c;今天讲的是多实例部署 在这里可以配置多实例的数量 如果设置800端口 设置两个实例 那么就是800 801端口 我的个人显卡是4060TI,最多开三个

kaggle之皮肤癌数据的深度学习测试

kaggle之皮肤癌数据的深度学习测试 近期一直在肝深度学习 很久之前&#xff0c;曾经上手搞过一段时间的深度学习&#xff0c;似乎是做轮胎花纹的识别&#xff0c;当初用的是TensorFlow&#xff0c;CPU版本的&#xff0c;但已经很长时间都没弄过了 现在因为各种原因&#xff…

【论文阅读】ELAN-Efficient Long-Range Attention Network for Image Super-resolution

ELAN-Efficient Long-Range Attention Network for Image Super-resolution 论文地址简介1 引言2相关工作2.1 基于 CNN 的 SR 方法2.2 基于 Transformer 的 SR 方法 3 方法论3.1 ELAN 的整体流程3.2 Efficient Long-range Attention Block (ELAB) 4实验4.1实验设置4.2 与轻量级…

Gray Zone Warfare灰区战争无法启动、登不上、加载失败解决办法

《灰区战争》是由捷克独立工作室开发、虚幻5引擎打造的开放世界FPS游戏&#xff0c;现已上线Steam页面&#xff0c;游戏将于2024年推出&#xff0c;暂不支持中文。当行动者 在对手做出反应之前迅速取得小规模胜利时&#xff0c;就出现了既成事实。例如&#xff1a;没收有争议的…

如何利用AI智能名片B2B2C商城系统将关键客户转化为数据驱动的会员

在数字化浪潮席卷全球的今天&#xff0c;数据无疑是企业发展的核心驱动力。然而&#xff0c;如何将这些无形的数字转化为企业实际增长的动力&#xff0c;却是许多企业面临的难题。特别是对于关键客户的管理&#xff0c;如何深入挖掘他们的价值&#xff0c;并转化为企业的忠实会…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…

力扣:61. 旋转链表(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码描述&#xff1a; 题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 输入&#xff1a; head [1,2,3,4,5], k 2 输出&#xff1a; [4,5,1,…

Java项目:基于SSM框架实现的视康眼镜网店销售管理系统眼镜商城(ssm+B/S架构+源码+数据库+毕业论文+PPT)

一、项目简介 本项目是一套基于SSM框架实现的视康眼镜网店销售管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

Android4.4真机移植过程笔记(三)

如果文章字体看得不是很清楚&#xff0c;大家可以下载pdf文档查看&#xff0c;文档已上传&#xff5e;oo&#xff5e; 7、安装加密APK 需要修改文件如下&#xff1a; 相对Android4.2改动还是蛮大的&#xff0c;有些文件连路径都变了: //Android4.2 1、frameworks/native/libs…

Java字符缓冲区

字符缓冲区是在计算机编程中非常重要的一种数据结构&#xff0c;它主要用于存储和高效地操作字符序列。 在 Java 中&#xff0c;StringBuffer类就是典型的字符缓冲区实现。与String类不同&#xff0c;StringBuffer具有动态可变性&#xff0c;这意味着我们可以在原有的字符序列…

【统计推断】-01 抽样原理之(四):中心极限定律(1)

文章目录 一、说明二、样本均值的抽样分布三、两个重要公理四、中心极限定理4.1 定义4.2 中心极限定理的特点4.3 中心极限定理的条件 五、一个举例5.1 一个连续分布示例5.2 样本容量变化的对比 六、结论 关键词&#xff1a;    Central Limit Theorem    Law of Large Numb…

机器学习 | 准确率、召回率、精准率、特异度傻傻分不清?ROC曲线怎么看?一篇文章帮你搞定

一、真正类、假负类、假正类与真负类 二、准确率、召回率、精准率、特异度与假正率 1. 准确率 (Accuracy) 准确率表明成功预测&#xff08;预测为负或为正&#xff09;的结果占总样本的百分比。 准确率 &#xff0c; 2. 召回率/查全率/灵敏度/真正率&#xff08;Recall&a…

新华三李玉涛:智算网络是解决AI算力需求的关键

近年来&#xff0c;人工智能领域呈现爆发式增长&#xff0c;尤其在OpenAI、文心一言等大模型的不断推出&#xff0c;参数规模实现了飞跃式增长。同时&#xff0c;Character AI、谷歌Bard等应用已经逐渐渗透至日常生活和工作当中&#xff0c;越来越多的人开始借助AIGC工具来提升…

最优二叉搜索树

一、二叉搜索树&#xff08;二叉查找树&#xff09; 所有根节点大于左子树的节点&#xff0c;小于右子树的节点的二叉树 满足以下性质&#xff1a; 1.如果左子树不为空&#xff0c;则左子树上的所有节点都小于根节点 2.如果右子树不为空&#xff0c;则右子树上的所有节点都大于…