Vue框架-路由

Vue Router 笔记

1. 路由管理

安装

方式一: 采用单页面CDN引入方式使用.

方式二: 基于vite构建的前端项目工程,安装依赖:

在项目根目录下, 安装:

npm install vue-router@4 -s

检查项目根目录下package.json中的dependencies是否多出: "vue-router"依赖.

路由简单使用

  1. src/components中创建demo1.vuedemo2.vue
<template><h1>第一个页面</h1>
</template><script>export default{}
</script><style>
</style>
  1. 修改src/App.vue
<script>export default{name: "App",components: {}}
</script><template><h1>HelloWorld</h1><p><router-link to="/demo1">page1</router-link><router-link to="/demo2">page2</router-link><router-view></router-view></p>
</template><style>
</style>
  1. 修改src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import { createRouter, createWebHashHistory} from 'vue-router'
import demo1 from './components/demo1.vue'
import demo2 from './components/demo2.vue'
const app = createApp(App)
const router = createRouter({history: createWebHashHistory(),routes: [{path: '/demo1',component: demo1},{path: '/demo2',component: demo2}]
})
app.use( router )
app.mount('#app')
  1. 测试: npm run dev 启动访问: localhost:3000/

带参路由

  1. 添加组件: User.vue
<template><h1>编号: {{ $route.params.uid }}</h1><h1>账号: {{ $route.params.username }}</h1>
</template><script>export default{}
</script><style>
</style>
  1. 编写main.js
import user from './components/User.vue'
{path: '/user/:uid/:username' , component: user}
  1. 测试访问:

问题: 采用路由参数时, 切记,相同的组件对象在导航地址切换的时候只会创建并复用,不会每次路由请求都刷新组件,故组件上的数据请求会更新,但是生命周期方法中的数据请求逻辑不会更新多次加载,故发现:

<template><h1>编号: {{ "将更新"+$route.params.uid }}</h1><h1>账号: {{ $route.params.username }}</h1>
</template><script>export default{mounted() {alert("只会加载一次: " +this.$route.params.uid);}}
</script><style>
</style>

解决办法: 采用导航守卫的方式来回调处理:

beforeRouteUpdate(to,from) {alert( "to的数据为: " + to.params.uid +" - from的数据为: " + from.params.uid );
}

路由的匹配规则

问题1: 发起/user/1请求时,无法区分以下两个路由.

{path: '/user/:username' , component: user1}
{path: '/user/:uid' , component: user2}

解决1:

{path: '/user/a/:username' , component: user1}
{path: '/user/b/:uid' , component: user2}

解决2: 基于正则.

{path: '/user/:username' , component: user1}
{path: '/user/:uid(\\d+)' , component: user2}

+ 表示1个或多个. :uid*表示可以出现0或多个编号 /1/2/3 , 将返回[1,2,3]

? 表示当没有传递uid也可以匹配成功.

{path: '/user/:uid?' , component: user2}

路由的嵌套

新建Teacher.vue

<template><h1>teacher页面....{{ $route.params.teachername }}</h1>
</template><script>export default{}
</script><style>
</style>

修改User.vue 组件: 调整新增的Teacher.vue组件到User中渲染输出,不在到App.vue

<template><h1>编号: {{ "更新"+$route.params.uid }}</h1><h1>账号: {{ $route.params.username }}</h1>//指定输出位置:<router-view></router-view>
</template>

修改main.js配置:

import teacher from './components/Teacher.vue'
{path: '/user/:uid/:username' , component: user,children: [//切记不用/开头{path: 'teacher/:teachername',component: teacher}]
}

测试发起请求:
http://localhost:3000/#/user/38/zhangsan/teacher/laowang

2. 页面导航

2.1 使用路由跳转

App.vue

方式一:

<router-link to="/demo1">page1</router-link>

修改为:

方式二:

<button @click="todemo1">去demo1</button>

并增加:

methods:{todemo1(){this.$router.push({path:'/demo1'})}
}

方式三:

main.js: {path: '/demo2',component: demo2 , name: 'demo2_router'} 取名.

<button @click="todemo2">去demo2</button>

并增加:

methods:{Todemo2(){this.$router.push({name: ‘demo2_router’})}
}

2.2 路由跳转并传递参数

main.js: {path: '/demo2/:a/:b',component: demo2 , name: 'demo2_router'} 取名.

<button @click="todemo2">去demo2</button>

并增加:

methods:{Todemo2(){this.$router.push({name: ‘demo2_router’,
params:{
a: 10,
b: 20
}})}
}

相当于:

<router-link :to="{ name: 'demo2_router',params:{b: 120,a: 125} }">page2</router-link>

测试:

Demo2.vue组件: {{$route.params.a}}{{$route.params.b}}

3. 路由视图

App.vue中:

<router-view name=”top”></router-view>
<router-view name=”main”></router-view>
<router-view></router-view>

Main.js中: 当遇到一个请求/demo1时,响应在主页面中,需要加载三个组件显示。

{path: '/demo1',components:{
top:  demo1,
main: demo2,
default: demo3
}}

4. 路由重定向

Main.js中: 当遇到一个请求/demo1时,响应在主页面中,需要加载三个组件显示。

{path: '/demo1',component:demo1,name:”d1”},
{path: '/to_demo1',redirect:/demo1’} 或者{path: '/to_demo1',redirect: {name: ‘d1’}}

动态重定向: 例如,登录才让路由访问,否则重定向其他位置.

{path: '/to_demo1',redirect: to => {
If(){
Return { path:/demo1’ };
}else{
Return { path:/demo2’ };
}
}}

5. 路由传参

问题: demo1.vue中每次解析数据{{ $route.param.uid }} 这种方式不如 {{uid}}方便.

解决:

demo1.vue:

{{ uid }}export default{
props: [‘uid’]
}

Main.js传递:

{path: '/demo1',component:demo1,props:route => {
Return {
Uid: route.params.uid,
Other:110}
}},

6. 路由导航守卫

作用: 决定路由跳转时,是否通过本次跳转.

Main.js:

全局前置守卫:

Router.beforeEach(( to , from ) => {
to为跳转的路由对象 , from 为离开的路由对象
//可以增加登录状态校验
Return { name: “toLogin” }
})

全局后置守卫:

Router.afterEach(( to , from , failure ) => {
//虽然不能改变导航,但是可以记录异常信息
Console.log( failure );
})

某个路由注册导航守卫:

Main.js:

{ path:/d1” , component: demo1 , beforeEnter: router => {
Return false;
} }

也可以设置为:

Export default{
beforeRouteEnter(to , from){
//前置守卫
Return true;
},beforeRouteUpdate(to , from){
//路由参数更新守卫}}

7. 动态路由

作用: 可在程序中控制增加路由和移除已注册的路由.

相当于动态注册路由对象:

Import demo2 from ‘./Demo2.vue’
Export default{
created(){
This.$router.addRoute({
Path:‘/d2’,component: demo2,name=”demo2”
});
}
}

移除:

this.$router.removeRoute(“demo2”)

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

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

相关文章

【学习心得】Pandas报错:“试图在来自数据帧的切片副本上设置值”

问题描述与分析 报错&#xff1a;“A value is trying to be set on a copy of a slice from a DataFrame” # data是某个DataFrame# 创建一个判断条件 cond (data[workclass] ?)# 想根据判断条件&#xff0c;修改DataFrame中的某些值 data[workclass][cond] unknown 这个…

KEIL5鼠标右键查找定义或声明选项变灰色不可选

原因&#xff1a;我直接点的KEIL图标打开了昨天的工程 解决办法&#xff1a;关掉工程&#xff0c;重新从文件夹的路径打开 其他原因导致试试以下方法&#xff1a; 1.快捷键F12导航到目标位置 2.路径不能含有中文&#xff0c;改好后&#xff0c;shiftAltf12&#xff0c;更新搜索…

24年gdcpc省赛C题

1279:DFS 序 先不考虑多节点,先看着颗二叉树,假设他们的父亲节点是第k个被访问的点,如果先访问左子树,那么得到的结果是a1*ka2*(k1)b1*(2k)b2*(2k1),可以发现,先访问左子树,那么右子树每次的乘以的p值实际上是左子树乘以的p值加上左子树的节点个数,比如a1*k和b1*(2k),如果不看2…

数据倾斜那些事儿

目录 一、什么是数据倾斜&#xff1f; 二、预判与预防 三、躲闪策略 四、硬刚策略 一、什么是数据倾斜&#xff1f; 之前在大厂当了好几年的sqlboy&#xff0c;数据倾斜这个“小烦人精”确实经常在工作中出没。用简单的话来说&#xff0c;数据倾斜就像是“贫富差距”在数据…

微软发布多模态模型Phi-3-vision,仅4.2B,小模型大潜力

前言 在大型语言模型&#xff08;LLM&#xff09;领域&#xff0c;模型参数规模与性能之间一直存在着密切的联系。近年来&#xff0c;虽然参数规模不断攀升&#xff0c;但随之而来的训练成本和推理成本也成为了制约模型发展的瓶颈。为了打破这一困境&#xff0c;微软推出了 Ph…

C#技术生态全景

分类汇总 1.WINFORM. 2.WINFORM - DevExpress. 3.WPF. 4.计算机网络协议。 1.HTTP 协议&#xff1a;超文本传输协议&#xff0c;用于在 Web 上发送和接收数据&#xff0c;是互联网上最常用的协议之一。2.FTP 协议&#xff1a;文件传输协议&#xff0c;用于在不同计算机之间传…

英语语法早操练-(上)

说起语法宝宝感觉心里苦。那么多语法注意点&#xff0c;哪个都放不到心里&#xff0c;句子表达还是错。这种情况是浪费了80%的时间做了达不到20%效果的事情。 要想写出没有语法错误的句子&#xff0c;那至少得知道词性和句子成分。 词性就是名词、动词、形容词、介词等 句子成分…

vue3父组件改变 子组件不改变(uniapp)

项目中遇到了这么个问题 场景&#xff1a;封装select组件&#xff0c;通过子组件选中后传递值给父组件&#xff0c;父组件需要回显这个值&#xff08;这里使用 defineProps和defineEmits就可以实现&#xff0c;或者直接使用defineModel也可以实现&#xff0c;但是uniapp目前不…

go语言如何创建一个可使用代理的http请求对象

在go语言的默认http.Transport对象中有一个Proxy属性&#xff0c; 我们如果需要创建一个可使用代理的http请求对象&#xff0c;只需要把我们的代理地址给赋值给这个Proxy即可&#xff0c;示例如下&#xff1a; //你要使用的代理地址 proxyUrl, _ : url.Parse("http://loca…

代码随想录算法训练营第53天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

1143. 最长公共子序列 如果最后一样就加一&#xff0c;如果不一样&#xff0c;取两种子序列最大值&#xff0c;三个方向递推 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp[[0]*(len(text2)1) for _ in range(len(text1)1)]for …

随机数真的随机吗?

随机数真的存在吗&#xff1f; 来讨论这个问题前&#xff0c;我们先定义下什么是随机数&#xff0c;通常我们指的的是一个结果&#xff0c;且不可预测&#xff0c;并且每个可能的结果都有相同的概率。 但是&#xff0c;在科学的世界里&#xff0c;随机从来就不存在&#xff0…

python中树的运用样例

目录 一、文件系统样例 二、Trie树 一、文件系统样例 class FileNode:def __init__(self, name, is_fileFalse):self.name nameself.is_file is_fileself.children []def add_child(self, child):self.children.append(child)# 创建文件系统结构 root FileNode("roo…

【并发程序设计】10.线程池

10.线程池 通俗的讲就是一个线程的池子&#xff0c;可以循环的完成任务的一组线程集合 必要性&#xff1a; 我们平时创建一个线程&#xff0c;完成某一个任务&#xff0c;等待线程的退出。但当需要创建大量的线程时&#xff0c;假设T1为创建线程时间&#xff0c;T2为在线程任务…

`var functionName = function() {}` 与 `function functionName() {}` 的区别探讨

本文将详细讲解和分析 JavaScript 中定义函数的两种标准形式:函数表达式和函数声明。理解这两种形式以及它们在不同情况下的行为,对于编写高效、可维护的代码非常重要。 函数声明 (Function Declaration) 函数声明是一种较为常见的定义函数的方式,语法如下: function x(…

Stable Diffusion AI绘画:从提示词到模型出图的全景指南

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

delphi,url中文编码

1、参考https://www.cnblogs.com/lucken2000/p/17582930.html 2、引用 HttpApp或IdURI 3、 function UrlEncodeUTF8(stInput : widestring): string; consthex : array[0..255] of string (%00, %01, %02, %03, %04, %05, %06, %07,%08, %09, %0a, %0b, %0c, %0d, %0e, %0f,…

「小明赠书活动」第四期《Java开发坑点解析:从根因分析到最佳实践》

目录 ⭐️ 赠书 - 《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 参 加 活 动 方 式 见 文 末 ⭐️内容简介 -《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 ⭐️阅读建议 -《Java开发坑点解析&#xff1a;从根因分析到最佳实践》 ⭐️《Java开发坑…

新人学习笔记之(JavaScript循环)

目录 一、循环 1.循环的目的 2.js中的循环 二、for循环 1.在程序中&#xff0c;一组被重复执行的语句被称之为循环体&#xff0c;能否继续重复执行&#xff0c;取决于循环的终止条件&#xff0c;由循环体及循环的终止条件组成的语句&#xff0c;被称之为循环语句 2.for循环重…

如果你有电脑,请狠下心来你死磕这6门技能

在这个日新月异、竞争激烈的时代&#xff0c;掌握一门技能已经远远不够。为了在职场中脱颖而出&#xff0c;我们需要不断地学习和提升自己的能力。你的电脑除了用来办公做文档外&#xff0c;还可以用它自学这些技能&#xff0c;让你轻松月入过万&#xff01; 1&#xff1a;编程…

JS基础知识 —— AOP面向切片开发

前言&#xff1a;学习笔记&#xff01; function test1() {console.log("-----------------");console.log(1);console.log("");}function test2() {console.log("-----------------");console.log(2);console.log("");}function test…