vue-10( 动态路由匹配和路由参数)

动态路由匹配和路由参数

动态路由匹配是 Vue Router 的一个强大功能,它允许你创建灵活且可重用的路由。您可以使用参数来捕获 URL 的动态段,而不是为每个可能的值定义特定路由。这在处理具有唯一标识符的资源(如用户配置文件、产品详细信息或博客文章)时特别有用。路由参数使您能够通过减少对硬编码路由的需求来构建更易于维护和可扩展的应用程序。

了解动态路由匹配

动态路由匹配涉及定义具有可更改段的路由。这些段由路由参数表示,路由参数由冒号 () 后跟名称表示。例如, /users/:id 定义一个路由,该路由与任何以 /users/ 开头的 URL 匹配,后跟一个将作为 id 参数捕获的动态分段。

基本示例

考虑您希望根据用户 ID 显示用户配置文件的场景。您可以定义如下路由:

const routes = [{ path: '/users/:id', component: UserProfile }
]

在此示例中,:id 是 route 参数。当用户导航到 /users/123 时,将呈现 UserProfile 组件,并且值 123 将作为 id 参数进行访问。

访问路由参数

UserProfile 组件中,您可以使用 $route.params 访问 route 参数。

<template><div><h1>User Profile</h1><p>User ID: {{ userId }}</p></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}}
}
</script>

在此组件中,userId 计算属性从 $route.params 检索 id 参数并将其显示在模板中。

多个路由参数

您可以在单个路由中定义多个路由参数。例如,如果您有一个类似于 /products/:category/:id 的路由,则可以在组件中访问 categoryid 参数。

const routes = [{ path: '/products/:category/:id', component: ProductDetails }
]
<template><div><h1>Product Details</h1><p>Category: {{ category }}</p><p>Product ID: {{ productId }}</p></div>
</template><script>
export default {computed: {category() {return this.$route.params.category;},productId() {return this.$route.params.id;}}
}
</script>

在这种情况下,导航到 /products/electronics/456 将呈现 ProductDetails 组件,其中 category 设置为 electronics,id 设置为 456

高级路由参数匹配

Vue Router 提供了控制路由参数匹配方式的高级选项。这包括可选参数、正则表达式匹配等。

可选参数

有时,您可能希望 route 参数是可选的。您可以通过在参数名称后添加问号 () 来实现此目的。例如,/search/:query? 使 query 参数可选。

const routes = [{ path: '/search/:query?', component: SearchResults }
]
<template><div><h1>Search Results</h1><p v-if="query">Query: {{ query }}</p><p v-else>Enter a search query.</p></div>
</template><script>
export default {computed: {query() {return this.$route.params.query;}}
}
</script>

在此示例中,导航到 /search 将呈现不带查询的 SearchResults 组件,而导航到 /search/vue 将呈现查询参数设置为 vue 的组件。

正则表达式匹配

您可以使用正则表达式为路由参数定义更具体的匹配条件。这是通过在参数名称后的括号内添加正则表达式来完成的。例如, /users/:id(\\d+) 仅当 id 参数由一个或多个数字组成时,才会匹配。

const routes = [{ path: '/users/:id(\\d+)', component: UserProfile }
]

此路由将匹配 /users/123,但不匹配 /users/abc

<template><div><h1>User Profile</h1><p>User ID: {{ userId }}</p></div>
</template><script>
export default {computed: {userId() {return this.$route.params.id;}},watch: {'$route.params.id': {handler(newId) {if (!/^\d+$/.test(newId)) {alert('Invalid User ID');this.$router.push('/'); // Redirect to home or another appropriate route}},immediate: true // Check on initial load}}
}
</script>

在此示例中,组件使用 watch 根据正则表达式验证 id 参数。如果 ID 不是数字,则会显示警报,并重定向用户。

Catch-all 路由

您可以使用 catch-all 路由来匹配与任何其他已定义路由不匹配的任何 URL。这是通过使用星号 (*) 作为路由路径来完成的。例如,/* 将匹配任何 URL。

const routes = [{ path: '/users/:id', component: UserProfile },{ path: '/*', component: NotFound }
]

在此示例中,如果用户导航到与 /users/:id 不匹配的 URL,则将呈现 NotFound 组件。

<template><div><h1>404 Not Found</h1><p>The requested page could not be found.</p></div>
</template>

优先权

定义路由时,定义路由的顺序很重要。Vue Router 按照定义的顺序匹配路由。因此,应在更通用的路由之前定义更具体的路由。

例如,如果您有以下路由:

const routes = [{ path: '/users/admin', component: AdminProfile },{ path: '/users/:id', component: UserProfile }
]

如果用户导航到 /users/admin,则将呈现 AdminProfile 组件,因为它是在 /users/:id 路由之前定义的。如果路由以相反的顺序定义,则将改为呈现 UserProfile 组件,并将 id 设置为 admin

实际示例和演示

让我们探索一些使用动态路由匹配和路由参数的实际示例。

博客文章示例

考虑一个博客应用程序,您希望在其中根据其独特的 slug 显示单个博客文章。

const routes = [{ path: '/blog/:slug', component: BlogPost }
]
<template><div><h1>{{ post.title }}</h1><p>{{ post.content }}</p></div>
</template><script>
export default {data() {return {post: {}};},mounted() {// Simulate fetching the blog post from an APIsetTimeout(() => {this.post = {title: 'My First Blog Post',content: 'This is the content of my first blog post.'};}, 500);}
}
</script>

在此示例中,BlogPost 组件根据 slug 参数获取博客文章数据。

电子商务产品示例

在电子商务应用程序中,您可能希望根据产品 ID 显示产品详细信息。

const routes = [{ path: '/products/:id', component: ProductDetails }
]
<template><div><h1>{{ product.name }}</h1><p>Price: {{ product.price }}</p><p>{{ product.description }}</p></div>
</template><script>
export default {data() {return {product: {}};},mounted() {// Simulate fetching the product details from an APIsetTimeout(() => {this.product = {name: 'Awesome Product',price: 99.99,description: 'This is an awesome product.'};}, 500);}
}
</script>

在此示例中,ProductDetails 组件根据 id 参数获取产品详细信息。

带参数的嵌套路由

您还可以将动态路由匹配与嵌套路由一起使用。例如,您可能有一个用于显示用户配置文件的路由和另一个用于显示其设置的路由。

const routes = [{path: '/users/:userId',component: UserProfile,children: [{path: 'settings',component: UserSettings}]}
]

在这种情况下,UserSettings 组件既可以访问父路由中的 userId 参数,也可以访问其自己的路由中定义的任何其他参数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

劫持进程注入

劫持进程注入和远程线程注入的区别就是 远程线程注入是向一个正在运行中的进程注入 而劫持进程注入则是自己打开一个进程(以挂起的方式) 然后再进行注入的操作 这样做的原因是当进程在挂起的状态时他的所有线程都是处于未启用的阶段 这样就可以避免目标进程的反注入线程的…

uni-app学习笔记二十--pages.json页面路由pages设置

uni-app 通过 pages 节点配置应用由哪些页面组成&#xff0c;pages 节点接收一个数组&#xff0c;数组每个项都是一个对象&#xff0c;其属性值如下&#xff1a; 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现&#xff0c;配置项参考下方 pageStylene…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是&#xff0c;我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

链表题解——合并两个有序链表【LeetCode】

1. 算法思路 这段代码的核心思想是 合并两个有序链表。具体步骤如下&#xff1a; 初始化哨兵节点&#xff1a; 创建一个哨兵节点 dummy&#xff0c;用于简化链表操作&#xff0c;避免处理头节点的特殊情况。使用指针 cur 指向 dummy&#xff0c;用于构建新的链表。 遍历两个链…

K8S集群主机网络端口不通问题排查

一、环境&#xff1a; k8s: v1.23.6 docker: 20.10.14 问题和故障现象&#xff1a;devops主机集群主机节点到端口8082不通&#xff08;网络策略已经申请&#xff0c;并且网络策略已经实施完毕&#xff09;&#xff0c;而且网络实施人员再次确认&#xff0c;网络策…

qemu安装risc-V 64

参考这篇文章https://developer.aliyun.com/article/1323996&#xff0c;其中在wsl下面安装可能会报错环境变量中有空格。 # clean_path.sh#!/bin/bash# 备份旧 PATH OLD_PATH"$PATH"# 过滤掉包含空格、制表符、换行的路径 CLEAN_PATH"" IFS: read -ra PA…

python爬虫:RoboBrowser 的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、RoboBrowser概述1.1 RoboBrowser 介绍1.2 安装 RoboBrowser1.3 与类似工具比较二、基本用法2.1 创建浏览器对象并访问网页2.2 查找元素2.3 填写和提交表单三、高级功能3.1 处理文件上传3.2 处理JavaScript重定向3.3…

CTFSHOW-WEB-36D杯

给你shell 这道题对我这个新手还是有难度的&#xff0c;花了不少时间。首先f12看源码&#xff0c;看到?view_source&#xff0c;点进去看源码 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…

CentOS_7.9 2U物理服务器上部署系统简易操作步骤

近期单位网站革新&#xff0c;鉴于安全加固&#xff0c;计划将原有Windows环境更新到Linux-CentOS 7.9&#xff0c;这版本也没的说&#xff08;绝&#xff09;了&#xff08;版&#xff09;官方停止更新&#xff0c;但无论如何还是被sisi的牵挂着这一大批人&#xff0c;毕竟从接…

LVS-DR高可用-Keepalived

目录 Keepalved双机热备 核心概念 关键组件 工作流程 实例环境 配置keepalived Web服务器配置 Keepalved双机热备 Keepalived双机热备是一种基于VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;实现的高可用性解决方案&am…

Polar编译码(SCL译码)和LDPC编译码(BP译码)的matlab性能仿真,并对比香农限

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1香农极限 2.2 Polar码编译码原理与SCL译码 2.3 LDPC码编译码原理与BP译码 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2024b仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a…

AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?(实战增补篇)

一. 系统思维&#xff1a;产品工程的全局把控&#xff08;实战增补篇&#xff09; 1. 某智能风控系统的弹性架构实践 某消费金融公司在开发「30 秒极速贷」产品时&#xff0c;面临两大挑战&#xff1a; Prompt 优化困境&#xff1a;传统风控模型依赖 “提取用户信用报告关键…

Unity程序集

对于Unity的程序集&#xff0c;具体内容可以参考Unity官方文档&#xff0c;程序集定义 - 预定义程序集 比如Unity的默认程序集&#xff0c;Assembly-CSharp.dll&#xff0c;还有其他的比如 Assembly-CSharp-Editor.dll&#xff0c;Assembly-CSharp-firstpass.dll 没有指定或…

【架构艺术】平衡技术架构设计和预期的产品形态

近期笔者因为工作原因&#xff0c;开始启动team内部部分技术项目的重构。在事情启动的过程中&#xff0c;内部对于这件事情的定性和投入有一些争论&#xff0c;但最终还是敲定了下来。其中部分争论点主要在于产品形态&#xff0c;因为事情涉及到跨部门合作&#xff0c;所以产品…

React和原生事件的区别

一、核心差异对比表 维度原生事件React 事件绑定语法HTML 属性&#xff08;onclick&#xff09;或 DOM API&#xff08;addEventListener&#xff09;JSX 中使用驼峰式属性&#xff08;onClick&#xff09;绑定位置直接绑定到具体 DOM 元素统一委托到根节点&#xff08;React …

大模型-modelscope下载和使用chatglm3-6b模型

前言 由于官方chatglm3-6b大模型文件下载比较慢&#xff0c;找到国内modelscope代替方案 1.SDK下载 pip install modelscope2.下载大模型文件 ✅方法1:通过pip下载 1.安装 setuptools 在当前使用的 Python 环境中安装 setuptools pip install setuptools2.通过如下命令安…

【unity游戏开发——编辑器扩展】AssetDatabase公共类在编辑器环境中管理和操作项目中的资源

注意&#xff1a;考虑到编辑器扩展的内容比较多&#xff0c;我将编辑器扩展的内容分开&#xff0c;并全部整合放在【unity游戏开发——编辑器扩展】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言一、AssetDatabase常用API1、创建资源1.1 API1.2 示例 …

css实现文字渐变

在前端开发中&#xff0c;给文字设置渐变色是完全可以实现的&#xff0c;常用的方式是结合 CSS 的 background、-webkit-background-clip 和 -webkit-text-fill-color 属性。下面是一个常见的实现方法&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> …

WSL 开发环境搭建指南:Java 11 + 中间件全家桶安装实战

在WSL&#xff08;Windows Subsystem for Linux&#xff09;环境下一站式安装开发常用工具&#xff0c;能极大提升工作效率。接下来我将分步为你介绍如何在WSL中安装Java 11、Maven、Redis、MySQL、Nacos、RabbitMQ、RocketMQ、Elasticsearch&#xff08;ES&#xff09;和Node.…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…