首页 > 其他分享 >Vue框架-路由

Vue框架-路由

时间:2024-05-28 09:02:18浏览次数:19  
标签:Vue uid 框架 vue demo2 demo1 path 路由

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”)

标签:Vue,uid,框架,vue,demo2,demo1,path,路由
From: https://blog.csdn.net/qq_61102168/article/details/139250621

相关文章

  • [分享]OffensiveCon24 UEFI 和翻译器的任务:使用跨架构 UEFI Quines 作为 UEFI 漏洞开
    链接:OffensiveCon24-uefi-task-of-the-translator目录x64assemblyx64程序集x64assemblysourcecodeforBGGP4entry:bggp4winningentry-x64assemblysourcecodeBGGP4UEFISelf-replicatingapp:bggp4winningentry-UEFIself-replicatingapp,compiledfromx64......
  • Vue+OpenLayers7入门到实战:OpenLayers实现在地图上拖拽编辑修改绘制图形
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上拖拽编辑修改绘制图形。在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地......
  • 每天五分钟深度学习框架pytorch:tensor张量的维度转换大全
    本文重点在深度学习中比较让人头疼的一点就是矩阵的维度,我们必须构建出符合神经网络维度的矩阵,只有将符合要求的矩阵放到神经网络中才可以运行神经网络,本节课程我们将学习以下tensor中维度的变化。view和shapeView和shape,这两个方法可以完成维度的变换操作,而且使用方法是一......
  • 【讲解下Web前端三大主流的框架】
    ......
  • Django框架前后端通信打通实战(PyCharm高级版)
    1.创建django项目并做好相关配置首先在pycharm高级版中创建django项目(1)选择左上角的四条小横线,然后找到文件下面的新建项目并点击,如下图:(2)点击完上图的新建项目之后,来到下面的页面. 然后点击左上角的Django,然后设置文件的位置,之后将模版文件夹的template这个单......
  • vue项目创建(git-bash版本)
    前言        1、安装git-bash        2、安装node.js        3、npm包管理工具安装        4、安装webpack工具        5、安装vue-cli        6、创建项目        7、问题报错解决方案前言      ......
  • Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册
    文章目录前言Dashboard开发总结前言后台管理系统中的Dashboard是一种图形化的信息显示工具,通常用于提供一个特定领域或系统的概况。它可以帮助用户监控和分析数据,快速获取重要信息。可以帮助用户监控业务状况、分析数据、获取关键信息和管理资源。通过合理的设计和......
  • Vue3实战笔记(47)— 一探emit奥秘——组件间通信的艺术与实践
    文章目录前言一、Vue2中的emti二、Vue3的emit总结前言Vue封装了自定义组件之后,如果子组件想要向父组件传递数据该怎么办?Vue.js中的emit方法就是主要用于组件间的通信,特别是父组件与子组件之间的通信机制。它是Vue组件内部触发自定义事件并向父级组件传递数......
  • 基于SpringBoot+Vue+uniapp的IT技术交流和分享平台的详细设计和实现(源码+lw+部署文档
    文章目录前言具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • vue3计算属性
    基础示例模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:我们想根据author是否已有一些书籍来展示不同的信息:这里的模板看起来有些复杂。我们必须认真看好一会儿才能明白......