vue 路由(二)-- 进阶

vue 路由(二)-- 进阶

    • 路由向组件传递参数
      • 传参方式
        • `:` 在路径传递参数
        • `params` + `name` 传递参数
        • query 参数
      • props 接收路由的 `params`
      • 完整的例子
    • HTML5 History 模式
    • meta 元信息
    • 导航守卫
      • 全局守卫
    • 过渡效果
    • 参考

路由可向路由匹配的组件传递参数, 不同情况 向组件传递不同的参数,从而实现组件的复用。

路由向组件传递参数

和路由匹配的组件可以在组件中使用 $route 获取路由上的参数:

传参方式

:paramsquery

: 在路径传递参数
{path: "/argu/:id/book",name: "argu",component: () => import("@/views/ArguPage")
}

路径 中的一部分是参数, 必须 传递该参数:

<!--路径跳转-->
<router-link to="/argu/123/book">path跳转</router-link>
<!--路由名跳转-->
<router-link :to="{name:'argu',params:{id:'test'}}" tag="button">name+params跳转</router-link>
<!--获取参数-->
<h1>{{$route.params.id}}</h1>
<!--params的名字路径中的的参数名一致-->

此时 path + parmas 传递参数, params 会被忽略。

params + name 传递参数

路由:

{path: "/argu",name: "argu",component: () => import("@/views/ArguPage")
}

跳转方式是 name + params +(query),通过 path 跳转,params 会被忽略。

<router-link :to="{name:'argu', params:{name:'hangge'}}">跳转到 hello</router-link>
<!-- path + params ,params 会被忽略,因为路径中没有定义参数 -->
<router-link :to="{path:'/argu', params:{name:'hangge'}}">跳转到 hello</router-link>
query 参数

query 参数,表现为查询字符串,和 location.search 一样的。

不需要先在路径中先定义,可通过 pathpath + query 或者 name + query 传递参数。

<router-link to="/argu?queryName=value">跳转到 hello</router-link>
<router-link :to="{path:'/argu',query:{queryName:value}}">跳转到 argu</router-link>
<router-link :to="{name:'argu',query:{queryName:value}}">跳转到 argu</router-link>
<h1>{{ $route.query.queryName }}</h1>

函数传递 query

// 注意是  $router 不是 $route
go() {this.$router.push({name: 'argu',query: {queryName: "你好"}})
}

但是这样使得 $route 和组件耦合在一起,不方便组件的复用,如果能将路由中的参数传递到组件的 props 就好了,恰恰是可以这样设置的。

props 接收路由的 params

路由传参数的三种方式:

  1. 布尔模式
{path: '/user/:id',component: User,props: true //表明 将 id 作为 props 传递到匹配的组件 User 中。
}

User 中定义 props 接收 id:

export default {props: {id: {type: String,default: 'jackZhou' //默认值}}
}
  1. 对象模式

将路由的 props 属性设置一个对象,也可在组件中获取到该值,这种方式往往用于传递静态值,即 name 值不会变化。

路由对象:

{name: 'home',alias: '/home_page',path: '/',props: {name: 'jack jack'},component: Home
}

Home 组件:

props: {name: {type: String,}
}
  1. 函数模式

以上两种方式,params 参数的名字必须和组件中的 props 属性名字相同,如果想对 params 进行改造后传递到组件,就可将 props 设置成函数,在函数内获取路由中的 params 或者 query,或者其他属性值,对其进行处理后再传递给组件。

注意:这种方式函数必须返回一个对象。

路由:

{name: 'about',path: '/about/:years', //params 有一个参数 yearsprops: (route) {const now = new Date()return {// 将 years 改造成 namename: (now.getFullYear() + parseInt(route.params.years)) + '!'}},component: () => import('@/views/AboutPage'),
}

组件中的 props:

props: {name: {type: String}
}

命名视图的路由,要为每个命名视图添加 props

{path: '/name/:view',name: 'name_view',components: {default: () => import('@/views/ChildPage'),sister: () => import('@/views/SisterPage'),brother: () => import('@/views/BrotherPage'),},props: {default: true,sister: false,brother: (route) => ({view: route.params.view.toUpperCase()})}
}

完整的例子

route 的 params 传递参数 – codepen

HTML5 History 模式

路由配置里有一个属性 mode ,默认值是 hash ,以 hash 来模拟一个 url,url 改变时,页面不会重新加载

先使用普通模式,可将 mode 设置成 history ,这种模式会使用 history.pushSate 来完成 url 跳转而页面不会重新加载。这种模式需要服务器设置一下

使用 history 模式,因为 web 应用往往是单页应用,当用户访问一个不存在的路径时,需要提供一个后备页面。

在路由配置的最后增加一个 404 路由:

{path: '*',component: NotFoundPage // 前面没有匹配的路由,最后会匹配该路由。
}

meta 元信息

可在路由对象中配置 meta 属性,meta 是一个对象。

比如,根据不同页面显示不同的 title。

{name: "about",path: "/about",meta: {title: "关于"},component: () => import("@/views/AboutPage")
}

在路由配置文件中,设置各个页面的 title:

const router = new Router({routes
})
router.beforeEach((to, from, next) => {//setTitle 函数用于设置页面标题to.meta && setTitle(to.meta.title) //这是简化if语句的简写console.table(to)console.table(from)next()
})
export default router

导航守卫

全局守卫

  1. 全局前置守卫
const router = new Router({{path: "/",name: "heom_page"component: Home,// 路由独享守卫beforeEnter: (to, from, next) => {// 处理逻辑next()}}
})
//每次路由进入都会调用
router.beforeEach((to, from, next) => {//处理逻辑,比如登录判断,可跳转到任意页面//不要忘记调用 next,不调用 next,页面不会跳转
})
  1. 后置钩子
//路由跳转之后做一些操作,比如去掉登录样式
router.afterEach((to, form) => {//逻辑处理
})
  1. 路由独享守卫
    只在匹配某个路由时执行。

  2. 组件内守卫

beforeRouteEnter , 组件创建之前调用,组件不具备 this
beforeRouteUpdate ,路由更新,而组件被复用时调用,可使用 this
beforeRouteLeave ,离开路由时调用,可使用 this

export default {name: 'Home',data() {return {}},/*** 组件内路由守卫* 1. 该函数在路由进入时执行* 2. 此时组件还未渲染,不可用 this, 当可在  next 中用 vm* 3. next 晚于 mounted 执行,next 之前的代码,早于 beforeCreate 执行* 4. 最后需要调用 next 使得路由跳转*/beforeRouteEnter(to, from, next) {console.log('①,home 组件内路由守卫,beforeRouteEnter')// next 晚于 mounted 执行,next 之前的代码,早于beforeCreate 执行next(vm => {console.log('vm')console.log(vm) //有值console.log('this')console.log(this) // undefinedconsole.log('②,home 组件内路由守卫,beforeRouteEnter')})},/*** 组件内路由守卫* 1. 该函数在路由离开时执行,最先调用,然后再调用全局守卫,再调用 beforeDestroy* 2. 此时,该路由守卫所在组件已渲染,可用 this* 3. 最后需要调用 next 使得路由跳转*/beforeRouteLeave(to, from, next) {console.log('①,home 组件内路由守卫,beforeRouteLeave')let leave = confirm('你确定要离开 home 页吗?')if (leave) {// console.log(to.name, from.name);// console.log(this);next(() => {console.log('②,home 组件内路由守卫,beforeRouteLeave')}) //给 next 传递 false ,路由不会跳转} else {next(false)}},/** 当路由发生变化,而组件被复用时调用* 1. 此时该复用组件已被渲染,可用 this* 2. 需要调用 next,组件才能渲染*/beforeRouteUpdate(to, from, next) {console.log('①,argu,组件内路由守卫,beforeRouteUpdate')next(() => {console.log('next,argu,组件内路由守卫,beforeRouteUpdate')})},beforeCreate() {console.log('beforeCreate')},created() {console.log('created')},beforeMount() {console.log('beforeMount')},mounted() {console.log('mounted')},beforeUpdate() {console.log('beforeUpdate')},updated() {console.log('updated')},beforeDestroy() {console.log('beforeDestroy')},destroyed() {console.log('destroyed')}
}

路由全过程:

  1. 导航被触发
  2. 离开页面(失活的组件)里调用离开守卫 beforeRouteLeave
  3. 调用全局前置守卫 beforeEach
  4. 在重用的组件里调用 beforeRouteUpdate (非重用组件,没有这个步骤)
  5. 调用路由独享守卫 beforeEnter
  6. 解析异步路由组件
  7. 在进入页面(激活组件)调用 beforeRouteEnter
  8. 调用全局解析守卫 beforeResolve (导航被确认之前,组件内守卫和异步路由组件被解析之后,调用 beforeResolve)
  9. 导航被确认(什么时候被确认,全部钩子执行完了,是被确认的)
  10. 调用全局后置守卫 afterEach
  11. 触发 DOM 更新
  12. 在 vue 实例中(此时页面解析完毕了吗?是的)调用 beforeRouterEnter 守卫里传给 next 的回调。nextmounted之后被调用。

过渡效果

可以给路由匹配的组件设置过渡效果,让页面平滑地显示,提升用户体验。
需要用到 transition 标签,如果有多个视图需要过渡,则用 transition-group

<transition-group name="router-view"><!-- 视图渲染组件,该组件内不需要房子任何内容,可写成只闭合标签--><router-view key="default" /><!-- 有多个路由视图需要匹配,则用命名视图 --><router-view key="sister" name="sister"></router-view><router-view key="brother" name="brother"></router-view>
</transition-group>

css 过渡效果:

.router-view-enter {opacity: 0;
}.router-view-enter-active {transition: opacity 1s ease;
}.router-view-enter-to {opacity: 1;
}.router-view-leave {opacity: 1;
}.router-view-leave-active {transition: opacity 1s ease;
}.router-view-leave-to {opacity: 0;
}

这些设置,每个页面的效果都是一样的,要为不同的页面设置不同的效果,可用路由传递相应的参数来,让动态绑定到 transition 的 name 属性上。

或者监听路由变化:

watch: {'$route'(to) {console.log(to);to.params && to.params.view && (this.effect = to.params.view)},
}

参考

Vue.js - 路由 vue-router 的使用详解 2(参数传递)

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

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

相关文章

高能来袭|联想拯救者携手《黑神话:悟空》玩转东方神话世界

从2020年首次发布实机演示视频以来&#xff0c;《黑神话&#xff1a;悟空》便在全球范围内获得了广泛关注&#xff0c;成为国产3A游戏的现象级爆款。6月&#xff0c;联想拯救者正式宣布成为《黑神话&#xff1a;悟空》全球官方合作伙伴&#xff0c;致力于共同革新国产游戏体验&…

第十二届蓝桥杯C++青少年组中/高级组选拔赛2020年11月22日真题解析

一、编程题 第1题&#xff1a;求和 【题目描述】 输入一个正整数 N(N < 100)&#xff0c;输出 1 到 N(包含 1 和 N)之间所有奇数的和。 【输入描述】 输入一个正整数 N(N < 100) 【输出描述】 输出 1 到 N 之间的所有奇数的和 【输入样例】 3【输出样例】 4答案&…

LIP模型动力学方程例子

线性倒立摆(Linear Inverted Pendulum, LIP)模型是用于描述和控制人形机器人步态的重要工具。LIP模型假设质心沿着一条固定的直线运动,并且所有质量集中在质心上。这简化了计算,使得模型更容易用于控制和稳定分析。 LIP模型动力学方程 LIP模型的基本假设是: 机器人的质心…

【病理数据】svs格式数据解读

Openslide 病理图像通常以.svs格式存储在数据库中。要想使用python处理svs格式的图像&#xff0c;我们通常使用Openslide模块。 关于Openslide模块的安装详见这个博客&#xff1a; 【解决Error】ModuleNotFoundError: No module named ‘openslide‘ 病理图像数据结构 病理图…

Latex中表格(3)

Latex中的表格 一、多行或多列单元格 这篇主要说Latex中表格出现多行或者多列单元格的形式. 一、多行或多列单元格 可能用到的宏包 \usepackage{booktabs}\usepackage{multirow} 代码&#xff1a; \begin{table}[h!] \centering \caption{Your caption here} \begin{tabul…

【iOS】UI——关于UIAlertController类(警告对话框)

目录 前言关于UIAlertController具体操作及代码实现总结 前言 在UI的警告对话框的学习中&#xff0c;我们发现UIAlertView在iOS 9中已经被废弃&#xff0c;我们找到UIAlertController来代替UIAlertView实现弹出框的功能&#xff0c;从而有了这篇关于UIAlertController的学习笔记…

Nextjs学习教程

一.手动创建项目 建议看这个中文网站文档,这个里面的案例配置都是手动的,也可以往下看我这个博客一步步操作 1.在目录下执行下面命令,初始化package.json文件 npm init -y2.安装react相关包以及next包 yarn add next react react-dom // 或者 npm install --save next react…

k8s常见故障--yaml文件检查没有问题 pod起不来(一直处于创建中)

故障信息 pod一直处于创建中 查看pod详细信息显示 kubectl describe pod 容器id文字 Events: Type Reason Age From Message Normal Scheduled 5m30s default-scheduler Successfully assigned default/nginx-server2-f97c6b9d5-d6dsp to worker02 Warning FailedCreatePod…

C语言之字符函数总结(全部!),一篇记住所有的字符函数

前言 还在担心关于字符的库函数记不住吗&#xff1f;不用担心&#xff0c;这篇文章将为你全面整理所有的字符函数的用法。不用记忆&#xff0c;一次看完&#xff0c;随查随用。用多了自然就记住了 字符分类函数和字符转换函数 C语言中有一系列的函数是专门做字符分类和字符转换…

Python | 刷题笔记

继承 class Father:__secret"you are your own kid"stroy"iam a handsome boy..."def tellstory(self):print("我的故事:",self.stroy)def __tellstory(self):print("我的秘密:",Father.__secret) class Son(Father):def tell(self…

XML解析库tinyxml2库使用详解

XML语法规则介绍及总结-CSDN博客 TinyXML-2 是一个简单轻量级的 C XML 解析库,它提供了一种快速、高效地解析 XML 文档的方式。 1. 下载地址 Gitee 极速下载/tinyxml2 2. 基本用法 下面将详细介绍 TinyXML-2 的主要使用方法: 2.1. 引入头文件和命名空间 #i…

Acrobat Pro DC 2023 for Mac/Win:全平台PDF编辑器的终极解决方案

对于需要处理PDF文档的个人和企业用户来说&#xff0c;Adobe Acrobat Pro DC 2023是一款不可或缺的工具。作为全球领先的PDF编辑器&#xff0c;Acrobat Pro DC 2023在Mac和Windows平台上提供了丰富的功能和令人印象深刻的性能&#xff0c;使其成为用户编辑、转换和管理PDF文档的…

Vue09-事件处理

一、一个简单的示例 v-on&#xff1a;当xxx的时候。 二、事件处理 2-1、参数说明 <div id"root"><h1>你好呀&#xff0c;{{name}}</h1><button v-on:click"showinfo">点击我</button></div><script>new Vue({e…

像素着色技术在AI绘画中的革新作用

摘要&#xff1a;随着人工智能技术的不断进步&#xff0c;AI绘画已成为艺术和技术领域中的一个热门话题。本文将探讨像素着色技术在AI绘画中的应用及其对创作过程的影响&#xff0c;揭示这一技术如何推动艺术创作的革新。 引言&#xff1a; 传统的绘画方法要求艺术家具备高超的…

堆排序-调整算法

个人主页点这里!~ 1.堆 了解堆排序首先要了解一下堆这个数据结构 堆&#xff08;Heap&#xff09;是一种特殊的树形数据结构&#xff0c;它通常被表示为一个完全二叉树或近似完全二叉树&#xff0c;并且满足堆性质&#xff08;Heap Property&#xff09;。堆主要分为两种&…

【web前端开发】标签(基础知识详解)

浏览器能识别的标签 编码 <meta charset"UTF-8"> title <title>helloshh</title> 标题 <h1>1级标签</h1> <h2>2级标签</h2> <h3>3级标签</h3> <h4>4级标签</h4> <h5>5级标签</h5> &…

【Mtk Camera开发学习】01 MTK 平台Camera BringUp

本专栏内容针对 “知识星球”成员免费&#xff0c;欢迎关注公众号&#xff1a;小驰行动派&#xff0c;加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台&#xff0c;Camera BringUp会涉及到修改的模块。 MTK不同的平台系列&#xff0c;具体修改…

mysql order by后跟case when

在SQL中&#xff0c;ORDER BY子句用于对查询结果进行排序。当在ORDER BY后面使用CASE语句时&#xff0c;它的原理是&#xff1a;根据CASE语句中定义的条件和结果&#xff0c;为查询结果集中的每一行生成一个临时的排序值。然后&#xff0c;根据这些排序值对结果集进行排序。 具…

突发!凌晨4点某制造业大厂国产数据库集群故障...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

GIT生成SSH公钥图文教程

参考&#xff1a;GIT生成SSH公钥图文教程-CSDN博客 这样做好之后&#xff0c;如果要在D盘目录下载代码&#xff0c;则把id_rsa和id_rsa.pub拷贝到对应目录下 不能使用ToitoiseGit下载代码&#xff0c;只能使用Git Bash下载文件 git clone ssh://xxx.git