关于TagsView的一些记录

2023-11-17

参考TagsView原链接https://blog.csdn.net/Dream_xun/article/details/83146106

开发项目时,使用基础tagsView遇到的问题,代码基本上与原链接一致,仅有一些基础功能。

本人开发项目为Nuxt项目。

下面说一下遇到的问题,记录一下,算是避坑吧:

首先, <nuxt />改写

<transition name="fade-transform" mode="out-in">
  <nuxt keep-alive :keep-alive-props="{ include: $store.state.tagsView.cachedViews }"                     
     class="app-page" />
</transition>

1. TagsView.vue 的修改

1)更改了TagsView.vue的插槽slot内容 ,原代码ref="tag"中未加class="tags-view-item",需注意一下,另外样式不起作用,可先将下方style里的scope去掉,但要留意样式可能冲突。

    <scroll-pane class="tags-view-wrapper" ref="scrollPane">
      <span
        v-for="tag in Array.from(visitedViews)"
        ref="tag"
        :key="tag.path"
        :data-name="tag.name"
        :data-path="tag.path"
        :data-full-path="tag.fullPath"
        :class="isActive(tag) ? 'active' : ''"
        class="tags-view-item"
        @click="() => goToPage(tag)"
        @click.middle="!isAffix(tag) ? closeSelectedTag(tag) : ''"
        @contextmenu.prevent="openMenu(tag, $event)"
      >
        {{ $t(`leftSideBar.pageList.${tag.title}`) }}
        <span
          v-if="!isAffix(tag)"
          class="el-icon-close"
          @click.prevent.stop="closeSelectedTag(tag)"
        />
      </span>
    </scroll-pane>

2) 自定义首页的标签配置,可参考。pageKey根据项目需要,可能是其他字段。

import ScrollPane from '@/components/tagViews/ScrollPane';
// 自定义首页的标签配置,下面的route2View方法中使用
  const indexViewInfo = {
    path: '/',
    fullPath: '/',
    name: 'lang',
    title: 'home',
    meta: {
      pageKey: 'home',
      noCache: false,
      affix: true,
      icon: undefined
    }
  };
  
  export default {

 3)methods方法的更改,仅做了修改了方法的记录

      // 例如首页一般不需要关闭页签
      isAffix(tag) {
        return tag.meta && tag.meta.affix;
      },
      // 可以对跳转的页签做些操作,如我这个对国际化跳转时页签做了调整
      goToPage(tag) {
        const locale = `/${this.$store.app.i18n.locale}/`;
        const oriLocale = tag.path.substring(0, 4);
        const pathLocale = tag.path.replace(oriLocale, locale);
        this.$router.push({
          path: pathLocale,
          query: tag.query
        });
      },
      // 原代码addViewTags方法在添加tab页签数组时,会造成泄露
      // 报错:Error in render: "RangeError: Maximum call stack size exceeded
      addViewTags() {
        if (this.$route.path.startsWith('/redirect')) {
          return;
        }
        this.route2View();
        if (this.routeView) {
          this.$store.dispatch('tagsView/addVisitedViews', this.routeView);
        }
      },
      // indexViewInfo定义在import下面,export default上面
      route2View() {
        if (this.$route.path === '/') {
          this.routeView = indexViewInfo;
        } else {
          const cachedViewName = this.$route.name;
          this.routeView = {
            meta: this.$route.meta,
            path: this.$route.path,
            query: this.$route.query,
            fullPath: this.$route.fullPath,
            name: cachedViewName
          };
        }
      },
      moveToCurrentTag() {
        const tags = this.$refs.tag;
        this.$nextTick(() => {
          for (const tag of tags) {
            // 以组件name为标准匹配
            if (tag.getAttribute('data-name') === this.$route.name) {
              this.$refs.scrollPane.moveToTarget(tag.$el);
              break;
            }
          }
        });
      }

2. ScrollPAne.vue,位置定位方法修改

moveToTarget(currentTag) {
        const $container = this.$refs.scrollContainer;
        const $containerWidth = $container.offsetWidth;
        const $scrollWrapper = this.scrollWrapper;
        const tagList = this.$parent.$refs.tag;

        let firstTag = null;
        let lastTag = null;

        // find first tag and last tag
        if (tagList.length > 0) {
          firstTag = tagList[0];
          lastTag = tagList[tagList.length - 1];
        }
        if (firstTag === currentTag) {
          $scrollWrapper.scrollLeft = 0;
        } else if (lastTag === currentTag) {
          $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth;
        } else {
          // find preTag and nextTag
          const currentIndex = tagList.findIndex(item => item === currentTag);
          const prevTag = tagList[currentIndex >= 1 ? currentIndex - 1 : 0];
          const nextTag = tagList[currentIndex + 1];
          // the tag's offsetLeft after of nextTag
          const afterNextTagOffsetLeft = nextTag.offsetLeft + nextTag.offsetWidth + tagAndTagSpacing;
          // the tag's offsetLeft before of prevTag
          const beforePrevTagOffsetLeft = prevTag.offsetLeft - tagAndTagSpacing;
          if (
            afterNextTagOffsetLeft >
            $scrollWrapper.scrollLeft + $containerWidth
          ) {
            $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth;
          } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) {
            $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft;
          }
        }
      }

 另外,Vue router / element 项目重复点击路由报错,一般可参考https://www.cnblogs.com/dhui/p/13329316.html

我的写在路由守卫里面,也当个参考吧

// 各个项目的获取VueRouter的方法可能不一样,用的时候要灵活转换,我的项目是app.router,且使用了
// constructor才获取原型。
// 获取原型对象上的push函数
const originalPush = app.router.constructor.prototype.push;
// 修改原型对象中的push方法
app.router.constructor.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err);
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于TagsView的一些记录 的相关文章

随机推荐

  • 持续增加时间价值30条

    今天分享阅读 时间价值 第一章时的笔记 持续增加时间价值30条 1 当你认为时间在帮助自己的时候 就觉得他是自己的朋友 当你有了要做的事情 当你在确定的方向上往前走 那么时间是在累积我们的成果 就是在帮我们的忙 2 在大的时间面前不要做太小
  • [深入研究4G/5G/6G专题-45]: 5G Link Adaption链路自适应-1-总体架构

    目录 第1章 链路自适应技术概述 1 1 概述 1 2 链路自适应技术的类型 1 3 基本概念
  • 电信行业BOSS系统

    BOSS系统 是Business Operation Support System的简称 即业务运营支撑系统 通常所说的BOSS系统分为四个部分 计费及结算系统 营业与账务系统 客户服务系统和决策支持系统 BOSS系统从业务层面来看就是一个
  • 什么是 JSONP?

    前言 首先我们得先了解JSONP是怎么产生的 最开始跨域请求数据没有现在方便 Ajax直接请求普通文件存在跨域无权限访问的问题 然后聪明的程序员想出了一套非官方的解决办法 程序员发现凡是带有 src 这个属性的标签都拥有跨域的能力 比如 l
  • 自媒体创作审核不通过怎么办?教你一个小技巧,提高效率

    自媒体人是不是会遇到平台审核内容不通过的时候 遇到这个问题你是怎么解决的呢 是不是修改内容提交还是不通过 今天 教你一个小技巧 快速解决内容审核不通过的问题 提高发稿效率 很多自媒体新手不知道稿件还能不能进行质量检测 所以 有时候写的自媒体
  • [深入研究4G/5G/6G专题-24]: 5G NR开机流程4.2 - 随机接入应答消息MSG2的调度过程与上行同步、时间提前量TA通过PDSCH信道下发

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 前置条件 第1章 随机接入知识准备
  • UNIAPP中文字上下左右居中

    效果 index vue
  • Flutter drawer侧滑栏实现

    侧滑栏对于大部分App来说都是经常用到的 接下来我们来一步步的实现flutter的侧滑栏效果 这里需要使用flutter提供的 Drawer和DrawerHeader控件 DrawerHeader通常用作侧滑栏的头部控件 比如用户头像等 D
  • Vulnhub之Me-and-My-Girlfriend

    Vulnhub是一个很好的靶机平台 想看官网点这里 今天学习Me and My Girlfriend 点击这里下载哦 这个比较简单 入门学习 VMware和VirtualBox都可以导入 成功后如图 这里修改连接为NAT模式 然后就开始玩耍
  • Mybatis使用datetimepicker日期和时间插件查询时间范围

    使用说明 collectStartDate和setStartDate类型为Date 对应的创建时间在mysql中为varchar类型 一 下载和引入datetimepicker样式和js 二 页面代码 li li
  • ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 已解决

    今天用Navicat Premium 连接 Oracle时报错了 报错信息 ORA 12514 TNS listener does not currently know of service requested in connect des
  • linux压缩文件夹命令 tar_每天一个Linux系统命令|tar

    名称 tar命令是Linux系统下最常用的打包命令 它不但可以对文件或者文件夹打包 还可以打包的时候同时压缩文件 用法描述 tar 选项 目标文件 源文件 压缩 tar 选项 压缩文件 解压 选项描述 如下是该命令的一些选项 按照使用频率进
  • 从零开始开发自己的类keras深度学习框架7:简易版word2vec

    认真学习 佛系更博 前面几章基本介绍了全连接神经网络和卷积神经网络的原理已经开发过程 本章开始将写一些自然语言处理相关的知识 当然 自然处理领域的知识点比图像处理的要复杂 抽象 可能要花更多时间来研究 首先 我们来了解一下word2vec
  • 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统

    针对海量的新闻资讯数据 如何快速的根据用户的检索需要 完成符合用户阅读需求的新闻资讯推荐 本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐 通过余弦相似度算法完成针对不同新闻数据之间的相似性计算 实现分类标签 通过协同过滤算法发
  • CLIP视觉编码器

    VisionTransformer conv1 Conv2d 3 768 kernel size 16 16 stride 16 16 bias False ln pre LayerNorm 768 eps 1e 05 elementwis
  • 使用docker在基础镜像上集成tomcat

    当我们对基础镜像版本和tomcat版本有要求时 可以尝试自己集成所需的镜像 不必每次都去拉取其他人提供的镜像 然后在此基础镜像上部署自己的应用 目标版本 基础镜像版本 ubuntu 16 04 JDK版本 jdk1 8 0 191 tomc
  • gitlab-建代码仓库

    一 生成 添加SSH公钥 你可以按如下命令来生成 sshkey ssh keygen t ed25519 C xxxxx xxxxx com 这里的 xxxxx xxxxx com 只是生成的 sshkey 的名称 并不约束或要求具体命名为
  • dwr反转ajax功能,dwr实现Reverse Ajax推送技术的三种方式

    DWR2 x的推技术也叫DWR Reverse Ajax 逆向Ajax 主要是在BS架构中 从服务器端向多个浏览器主动推数据的一种技术 在DWR所开的线程中使用Reverse Ajax时 经过WebContextFactory get 获取
  • GD32 CAN波特率计算问题

    一 问题描述 以下是GD32F205 CAN0的配置代码 将CAN0的波特率设置为125kbps 其中影响波特率的几个关键参数为resync jump width time segment 1 time segment 2和prescale
  • 关于TagsView的一些记录

    参考TagsView原链接https blog csdn net Dream xun article details 83146106 开发项目时 使用基础tagsView遇到的问题 代码基本上与原链接一致 仅有一些基础功能 本人开发项目为