vue3+vite中使用path-to-regexp以及相关的报错问题

2023-11-13

前言:

       path-to-regexp 该方法的作用是把字符串转为正则表达式。一般我们使用动态匹配路由的时候会用到这个。

1、介绍path-to-regexp ,更多点我查看

pathToRegexp()

pathToRegexp('/foo/:bar')
打印结果:
/^/foo/((?:[^/]+?))(?:/(?=$))?$/i

exec()

作用:匹配 url 地址与规则是否相符。

parse()

作用:解析 url 字符串中的参数部分(:id)。

compile()

作用:快速填充 url 字符串的参数值。

var pathToRegexp = require('path-to-regexp')

var url = '/user/:id/:name'
var data = {id: 10001, name: 'bob'}
console.log(pathToRegexp.compile(url)(data))
打印结果:
/user/10001/bob

2、使用path-to-regexp 报错以及解决情况

报错:

 

解决办法

import pathToRegexp from 'path-to-regexp'  修改为:
import * as pathToRegexp from 'path-to-regexp'

 3、vue3+vite 中重新封装相关组件

vue2源码:

<template>
  <el-breadcrumb class="app-breadcrumb" separator="/">
    <transition-group name="breadcrumb">
      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect"><i :class="item.meta.icon"></i><span style="margin-left:5px;">{{ item.meta.title }}</span></span>
        <span v-else><i :class="item.meta.icon"></i><a @click.prevent="handleLink(item)" style="margin-left:5px;">{{ item.meta.title }}</a></span>
      </el-breadcrumb-item>
    </transition-group>
  </el-breadcrumb>
</template>

<script>
// import pathToRegexp from 'path-to-regexp'

export default {
  data() {
    return {
      levelList: null
    }
  },
  watch: {
    $route(route) {
      if (route.path.startsWith('/redirect/')) {
        return
      }
      this.getBreadcrumb()
    }
  },
  created() {
    this.getBreadcrumb()
  },
  methods: {
    getBreadcrumb() {
      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
      const first = matched[0]

      if (!this.isDashboard(first)) {
      }

      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
    },
    isDashboard(route) {
      const name = route && route.name
      if (!name) {
        return false
      }
      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
    },
    pathCompile(path) {
      const { params } = this.$route
      //pathToRegexp 把字符串转为正则表达式
      //pathToRegexp.compile() 快速填充 url 字符串的参数值
      var toPath = pathToRegexp.compile(path)
      return toPath(params)
    },
    handleLink(item) {
      const { redirect, path } = item
      if (redirect) {
        this.$router.push(redirect)
        return
      }
      this.$router.push(this.pathCompile(path))
    }
  }
}
</script>

<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
  display: inline-block;
  font-size: 14px;
  line-height: 50px;
  margin-left: 8px;

  .no-redirect {
    color: #97a8be;
    cursor: text;
  }
}
</style>

vue3最新源码:

<template>
  <el-breadcrumb class="app-breadcrumb" separator="/">
    <transition-group name="breadcrumb">
      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect"><i :class="item.meta.icon"></i><span style="margin-left:5px;">{{ item.meta.title }}</span></span>
        <span v-else><i :class="item.meta.icon"></i><a @click.prevent="handleLink(item)" style="margin-left:5px;">{{ item.meta.title }}</a></span>
      </el-breadcrumb-item>
    </transition-group>
  </el-breadcrumb>
</template>

<script>
import * as pathToRegexp from 'path-to-regexp'
import {
  reactive,
  watch,
  toRefs,
  getCurrentInstance,
  onMounted
} from 'vue'
export default {
  setup(){
    /************************ hx-定义数据data(START) ************************/
    const data = reactive({
      levelList: null
    })
    /************************ hx-定义数据data(END) ************************/

    /************************ hx-生命周期(START) ************************/
    const { proxy } = getCurrentInstance()

    onMounted(() => {
      getBreadcrumb()
    })
    const router = useRouter()
    watch(() => router.currentRoute.value.path,(toPath) => {
      //要执行的方法
      if (toPath.startsWith('/redirect/')) {
        return
      }
      getBreadcrumb()

    },{immediate: true,deep: true})
    /************************ hx-生命周期(END) ************************/

    /************************ hx-methods(START) ************************/
    function getBreadcrumb() {
      let matched = router.matched.filter(item => item.meta && item.meta.title)
      const first = matched[0]

      if (!isDashboard(first)) {}

      data.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
    }
    function isDashboard(route) {
      const name = route && route.name
      if (!name) {
        return false
      }
      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
    }
    function pathCompile(path) {
      const { params } = route
      debugger
      //pathToRegexp 把字符串转为正则表达式
      //pathToRegexp.compile() 快速填充 url 字符串的参数值
      var toPath = pathToRegexp.compile(path)
      return toPath(params)
    }
    function handleLink(item) {
      const { redirect, path } = item
      if (redirect) {
        router.push(redirect)
        return
      }
      router.push(pathCompile(path))
    }

    /************************ hx-methods(END) ************************/


    return {
      //数据
      ...toRefs(data),
      //methods
      handleLink
    }
  }
}
</script>

<style lang="scss" scoped>
.app-breadcrumb.el-breadcrumb {
  display: inline-block;
  font-size: 14px;
  line-height: 50px;
  margin-left: 8px;

  .no-redirect {
    color: #97a8be;
    cursor: text;
  }
}
</style>

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

vue3+vite中使用path-to-regexp以及相关的报错问题 的相关文章

  • Vue cli 3项目,图像路径中的动态src不起作用

    我在 vue 组件中引用图像 url 例如 img alt Vue logo src statics reports logo png 这有效 但在尝试的同时 img alt Vue logo data return imgPath sta
  • VueJS 将类切换到表中的特定元素

    我似乎不知道如何在表中的特定项目上切换类 我使用 v for 循环数据并将其打印给用户 目标是当用户单击表内的特定元素时切换类 当我尝试添加 v bind class active isActive 时 它只是将该类添加到所有类中 而不是特
  • vue.js keyup, keydown 事件落后一个字符

    我正在使用 keydown keyup 事件 它调用一个 javascript 函数 该函数将输入框的值打印到控制台 以及事件的 currentTarget 字段的值 并且我注意到它晚了一个字符 例如 如果我输入hello进入输入框 我只看
  • Vue Chart.js - 数据变化时图表不更新

    我正在使用 Vue js 和 Chart js 绘制一些图表 每次我调用该函数时generateChart 图表不会自动更新 当我在 Vue Devtools 中检查数据时 它们是正确的 但图表没有反映数据 但是 当我调整窗口大小时 图表确
  • #NUXT.JS 中常用组件方法的存储位置

    实际上我想知道 NUXT JS 中常见组件方法的存储位置 我尝试过的事情 gt 在中间件中存储公共代码 它没用 因为据我所知 中间件只能处理对服务器的请求和响应 methods states methods SwitchManager fu
  • 使用Vue组件渲染函数时无限循环

    我正在使用 Vue 组件来渲染一些表头 如下所示 render createElement return createElement div class header Array apply null length this initHou
  • 如何在外部 .js 文件中分离 .vue 组件的方法?

    我的组件留下了许多行代码 因此我决定将这些方法放在一个名为functions js 的单独文件中 我无法调用这些方法 我试过这个 函数 js function sendList function getLists function dele
  • 仅当内容超过两行时显示只读/隐藏按钮

    我正在创建一个评论部分 类似于 youtube 的东西 并且我希望能够在 content 有多行时显示阅读更多 隐藏按钮 这就是我到目前为止所做的 我的阅读更多 隐藏按钮可以工作 因为我添加了一个计算的线夹 使内容仅在存在多行时才显示两行
  • 观察数组中当前值的变化

    每当它改变半径和中心时 我想监视每个项目 每当它改变时 我想 console log 项目索引和值 let map ref null map value circles是一个数组 当我使用此监视功能时 它仅在加载时显示一次值 我希望每次它在
  • vuejs2复制剪贴板问题

    我正在尝试使用https alligator io vuejs vue clipboard copy https alligator io vuejs vue clipboard copy 对于 Vue js 中的复制剪贴板功能 它对于字符
  • 在 iframe/对象标签内运行时更新初始路由器 url

    我目前正在容器 主 Vue 应用程序的对象标签 iframe 也可以工作 内渲染 Vue 应用程序 首先 我设置一个文件服务器 为该容器或请求的子应用程序提供服务 以在 div 内呈现 为了简单起见 我将仅显示 Node Express 服
  • vue:转义并渲染 HTML 字符串?

    我正在尝试在模板中渲染一些 HTML 字符串 但我希望它们是字符串 我不想渲染 富文本 我开始于
  • 如何从特定索引渲染 v-for

    我想在 v for 中循环假设从数字 5 到 10 循环希望在 5 点开始并在 10 点结束 我试过这个 div div 但我想要更有效的循环方式 有谁知道如何让循环从 5 开始 对于你的例子来说是可能的 div some code her
  • 如何从 Laravel 将路由参数传递到 Vue.js

    我有这样的路线来获取带有相关评论的帖子 Route get api topics category id title function category id title return App Topic with comments gt
  • 如何在 Nuxt 中设置 netlify 表单

    当我通过添加带有 a 的链接来使用 vue router 导航到表单时
  • 将选定的值传递给 vuejs 函数

    如何将选定的值传递给 vuejs 函数 v model我猜不会有帮助 我需要在之后设置过滤器的值item items orderBy sortKey reverse where reverse and sortKey是动态值 html
  • vuetify 中的 v-app-bar 和 v-toolbar 有什么区别?

    我刚刚开始探索vuetify http vuetifyjs com 所有 vuetify 组件都位于
  • 将组件注册到现有的 Vue.js 实例

    我是 Vue js 新手 我想注册一个本地组件 如下所述 https v2 vuejs org v2 guide components html Local Registration https v2 vuejs org v2 guide
  • Vue 2 日期选择器组件

    我正在尝试使用 Bootstrap Datepicker 创建 Vue 2 组件 但在选择日期后尝试更新输入时遇到困难 这是我的代码 Vue component datepicker template
  • 如何将类型添加到 Vite 库构建中?

    我按照vite文档使用图书馆模式 https vitejs dev guide build html library mode我能够生成一个工作组件库 我创建了该项目vue ts预设 在我的组件中 我定义了道具及其类型 并使用了一些接口 但

随机推荐

  • C++ 类 & 对象

    C 在 C 的基础上增加了面向对象编程 OOP 支持面向对象程序设计 类是 C 的核心特性 一种用户自定义的类型 用于指定对象的形式 类包含数据和用于处理数据的方法 函数 数据称为成员变量 函数称为成员函数 类可以看作是一种模板 用来创建具
  • 2022-03-09 Unity 3D两个场景的切换

    文章目录 效果 实现步骤 1 创建场景 2 添加按钮 3 写C 脚本实现切换 4 添加Component到Button上 5 添加两个Scene到Build中 测试效果 参考资料 效果 在scene1中点击按钮 进入scene2 实现步骤
  • Android 高德地图 关于INVALID_USER_KEY和INVALID_USER_SCODE的问题

    本文主要讲我在配置高德地图时候碰到的问题和解决方法 希给遇到同样问题的你一些帮助 1 INVALID USER KEY 当时我的Log上显示此问题 并且显示key为空 但我明明在mete data标签中写了我的key值 后发现manifes
  • 基于Spring Boot AOP用户权限系统模块开发

    公司项目需要涉及到用户权限的问题 每个用户都应该有自己的权限 而且权限应该是灵活可变的 系统的登陆模块因为涉及到分布式部署的问题以及前后端分离 不能采用传统的session作为登陆方式 而是采用JWT的方式实现 保证了接口的无状态性 但是这
  • 初步认识Ehcache清空缓存的3种策略

    Ehcache是一种广泛使用的开源Java分布式缓存 主要面向通用缓存 Java EE和轻量级容器 它具有内存和磁盘存储 缓存加载器 缓存扩展 缓存异常处理程序 一个gzip缓存servlet过滤器 支持REST和SOAP api等特点 在
  • flutter dio HandshakeException: Handshake error in client 解决方法,以及DefaultHttpClientAdapter红线问题。

    是证书问题导致 下面是强制认证 import package dio dio dart import package dio adapter dart 导入这个包 添加DefaultHttpClientAdapter Response re
  • 错误【ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...】

    Downloading https download pytorch org models resnet50 19c8e357 pth to home luanhaijing cache torch hub checkpoints resn
  • 语音识别之获取语言数据(portaudio的平台搭建)

    我们要进行语言识别 那么就要先构建好平台 portaudio 我们需要采集所需要的16KHZ频率 16比特的声音信号 我们就可以采用portaudio来实现这个功能 那么这个Portaudio怎么使用呢 请看 http www cnblog
  • Java基础十一(private、this关键字和构造函数)

    私有private关键字 成员变量是否一定需要全部向外界访问 如果需要向外界访问 则public 如不需要向外界访问 则private 但是一般而言 都会将成员变量私有化 给成员变量 private是彻底不想给外界类中不需要对外提供的内容都
  • Python中类属性和类方法

    1 类的结构 1 1 术语 实例 使用面相对象开发 第 1 步 是设计 类 使用 类名 创建对象 创建对象 的动作有两步 1 在内存中为对象 分配空间 2 调用初始化方法 init 为 对象初始化 对象创建后 内存 中就有了一个对象的 实实
  • UID卡、CUID卡、FUID卡、UFUID卡的区别及写入方式

    UID卡 国外又称GEN1 所有区块可被重复读写 卡片ID可改写且使用后门指令更改ID 卡片ID可重复修改 相应后门指令 意味着可被使用后门指令检测是否为克隆卡的机器发现 CUID卡 国外又称GEN2 所有区块可被重复读写 卡片ID可改且使
  • align text-align

    align 规定 div 元素中的内容的水平对齐方式 text align 规定 元素中 的文本的水平对齐方式 两个属性使用的地方不一样的 div align center This is some text div align直接写在是d
  • WPF在TreeView的子项中的TextBlock,触发点击事件时,获得当前文本框所在的TreeViewItem数据对象

    要实现的效果是 在一个深层treeview控件的treeviewitem中有个textblock 而我要在点击这个textblock时阻断向下传递 e handle true 并且将当前这个项的绑定属性IsExpanded设置相反值 前台代
  • CSRF漏洞简单解决

    在表单内增加了一个隐藏域 再登陆页面增加 然后扫描软件在扫描就扫描不出来了 如下
  • 光敏电阻的原理及应用

    转载出 http www jqr8 com thread 1406 1 1 html 一 光敏电阻的概念 光敏电阻器 photovaristor 又叫光感电阻 是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器 入射光强 电
  • 第一章 Web前端技术简介 A卷

    一 选择题 在HTML中有效 规范的注释声明是 D A 这是注释 B C D 关于W3C标准 下列说法错误的是 B A W3C标准是由W3C组织制定的一系列Web标准 B htm span p 是符合W3C标准规范的书写方式 C W3C标准
  • python万能存储包pickle

    pickle几乎可以保存python的一切格式对象 字典 列表等等 无需将其转为numpy或pandas等其他格式再保存 缺点是它不像json等是通用格式 只能使用python来读取 pickle官方文档 pickle dump obj f
  • Docker源码修改工作总结(三)

    话不多说上干货 一 安装mysql数据库 并且建立相关表 在本地主机上安装mysql数据库 并且建立一个名为docker的数据库 在数据库中建立两个数据表分别为container auto和container user 分别代表自动生成的秘
  • leetcode题202快乐数,java解答,不断优化到beate100%

    一 问题描述 快乐数 Category Difficulty Likes Dislikes algorithms Easy 62 47 868 Tags hash table math Companies airbnb twitter ub
  • vue3+vite中使用path-to-regexp以及相关的报错问题

    前言 path to regexp 该方法的作用是把字符串转为正则表达式 一般我们使用动态匹配路由的时候会用到这个 1 介绍path to regexp 更多点我查看 pathToRegexp pathToRegexp foo bar 打印