Vue的router学习

这篇具有很好参考价值的文章主要介绍了Vue的router学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。

vue-router是基于路由和组件的
 路由用于设定访问路径, 将路径和组件映射起来;
 在vue-router的单页面应用中, 页面的路径的改变就是组件的切换;

使用router需要

1.在router文件夹内书写整个index.js文件

2.在View文件夹内书写具体的router文件内容

3.在App.vue文件夹想要替换内容的地方,写上路由占位符

4.main.js文件内import router from "./router",并且在mount app前app.use(router)

路由的使用步骤

◼ 使用vue-router的步骤:
 第一步:创建路由需要映射的组件(打算显示的页面);
 第二步:通过createRouter创建路由对象,并且传入routes和history模式;
✓ 配置路由映射: 组件和路径映射关系的routes数组;
✓ 创建基于hash或者history的模式;
 第三步:使用app注册路由对象(use方法);
 第四步:路由使用: 通过<router-link>和<router-view>;

Vue的router学习,vue.js,学习,前端

 0.报错:无法正常渲染router

报错1:

Vue的router学习,vue.js,学习,前端

Vue的router学习,vue.js,学习,前端

必须把use router写在mount前 

报错2:

Vue的router学习,vue.js,学习,前端

 要么是router-link没写to的路径,要么是  history:createWebHistory,这里没写()

1.简单使用

Vue的router学习,vue.js,学习,前端

Vue的router学习,vue.js,学习,前端

router文件夹index.js

import { createRouter,createWebHashHistory } from "vue-router";

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"


const router = createRouter({
	//指定采用的模式:hash
	history:createWebHashHistory(),
	//映射关系
	routes:[
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

export default router

Views文件夹下About与Home.vue文件

<template>
	<h2>about</h2>
</template>
<template>
	<h2>home</h2>
</template>

App.vue

<template>
<div class="app">
	<router-view></router-view>
	<h2>App content</h2>
</div>
</template>
 
<script setup>
  
 
</script>
 
<style lang="less" scoped>

</style>

main.js

import { createApp } from 'vue'
// import "./assets/reset.css"
import router from "./router"
 
import App from './App.vue'
 
const app = createApp(App)
 
// 全局注册

app.use(router)

app.mount('#app')

2.如果希望点击某个区域进行跳转:router-link

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<router-link to="/home">首页</router-link>
			<router-link to="/about">关于</router-link>
	</div>
	<router-view></router-view>
</div>
</template>
 
<script setup>
  
 
</script>
 
<style lang="less" scoped>

</style>

Vue的router学习,vue.js,学习,前端

 3.路由的默认路径

 默认情况下, 进入网站的首页, 我们希望<router-view>渲染首页的内容;
 但是我们的实现中, 默认没有显示首页组件, 必须让用户点击才可以;
◼ 如何可以让路径默认跳到到首页, 并且<router-view>渲染首页组件呢?
◼ 我们在routes中又配置了一个映射:
 path配置的是根路径: /
 redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.

const router = createRouter({
	//指定采用的模式:hash
	history:createWebHashHistory(),
	//映射关系
	routes:[
		{path:"/",redirect:"/home"},
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

4.history模式

使用WebHashHistory哈希模式,域名跳转时会有#,如果切成history则是日常的域名模式

import { createRouter,createWebHashHistory,createWebHistory } from "vue-router";

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"


const router = createRouter({
	//指定采用的模式:hash
	// history:createWebHashHistory(),
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",redirect:"/home"},
		{path:"/home",component:Home},
		{path:"/about",component:About},
	]
})

export default router

5.router-link的属性:to/replace/active/name

◼ router-link事实上有很多属性可以配置:
◼ to属性:
 是一个字符串,或者是一个对象

对象写法,记得:to,几乎不在to内使用对象写法

			<router-link :to="{path:'/about'}">关于</router-link>

◼ replace属性:
 设置 replace 属性的话,当点击时,会调用 router.replace(),而不是 router.push();

	<div class="nav">
			<router-link to="/home" replace>首页</router-link>
			<router-link to="/about" replace>关于</router-link>
	</div>

如果使用了replace属性,比如从百度进入8080页面,默认进入首页,此时点击进入关于界面,再点击返回,此时返回的不再是首页,而是百度页面

因为相当于百度→首页,关于页面替换了首页,此时百度→关于,所以点击返回按钮,返回百度界面

◼ active-class属性:
 设置激活a元素后自动应用的class,默认是router-link-active

Vue的router学习,vue.js,学习,前端
◼ exact-active-class属性:
 链接精准激活时,应用于渲染的 <a> 的 class,默认是router-link-exact-active;

 通过自动绑定的active类,可以对其进行样式操作

.router-link-active 
{
	color: red;
}

◼ name属性:路由记录独一无二的名称;
◼ meta属性:自定义的数据 

Vue的router学习,vue.js,学习,前端

6.路由懒加载

◼ 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载:
 如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效;
 也可以提高首屏的渲染效率;


◼ 其实这里还是我们前面讲到过的webpack的分包知识,而Vue Router默认就支持动态来导入组件:
 这是因为component可以传入一个组件,也可以接收一个函数,该函数 需要放回一个Promise;
 而import函数就是返回一个Promise;

默认 npm run build不分包(此写法几乎被摒弃

import Home from "../Views/Home.vue"
import About from "../Views/About.vue"

Vue的router学习,vue.js,学习,前端

 如果想要分包:

const Home=()=>import ("../Views/About.vue")
const About=()=>import ("../Views/Home.vue")

Vue的router学习,vue.js,学习,前端

如果希望知道到底每个包对应的内容 

使用webpack的魔法注释,webpack从3.x开始支持对分包进行命名(chunk name)

const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")

Vue的router学习,vue.js,学习,前端

 但是现在最广泛的写法是:

import { createRouter,createWebHashHistory,createWebHistory } from "vue-router";

// import Home from "../Views/Home.vue"
// import About from "../Views/About.vue"
// const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
// const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")


const router = createRouter({
	//指定采用的模式:hash
	// history:createWebHashHistory(),
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",
		redirect:"/home"
	},
		{path:"/home",
		component:()=>import ("../Views/Home.vue")
	},
		{path:"/about",
		component:()=>import ("../Views/About.vue")
	},
	]
})

export default router

7.动态路由基本匹配


◼ 很多时候我们需要将给定匹配模式的路由映射到同一个组件:
 例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但是用户的ID是不同的;
 在Vue Router中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数;

如果进入user页面,一般user界面会跟着id,但是我们默认的时user,此时无法匹配,无法进入user页面

Vue的router学习,vue.js,学习,前端

    {path:"/user/:id", 

const router = createRouter({
	history:createWebHistory(),
	//映射关系
	routes:[
		{path:"/",
		redirect:"/home"
	},
		{path:"/home",
		component:()=>import ("../Views/Home.vue")
	},
		{path:"/about",
		component:()=>import ("../Views/About.vue")
	},
	{path:"/user/:id",
	component:()=>import ("../Views/User.vue")
	},
	]
})

export default router

Vue的router学习,vue.js,学习,前端

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<router-link to="/home">首页</router-link>
			<router-link to="/about">关于</router-link>
			<router-link to="/user">用户</router-link>

			<router-link to="/user/321">用户321</router-link>
			<router-link to="/user/123">用户123</router-link>
	</div>
	<router-view></router-view>
</div>
</template>

Vue的router学习,vue.js,学习,前端

 8.获取动态路由的值

◼ 那么在User中如何获取到对应的值呢?
 在template中,直接通过 $route.params获取值;
✓ 在created中,通过 this.$route.params获取值;
✓ 在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;
➢ 该Hook会返回一个Route对象,对象中保存着当前路由相关的值;

法一:在template中,直接通过 $route.params获取值;

<template>
	<h2 class="user">User:{{$route.params}}</h2>
</template>
	{path:"/user/:id",
	component:()=>import ("../Views/User.vue")
	},

Vue的router学习,vue.js,学习,前端

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

Vue的router学习,vue.js,学习,前端

法二:在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

<script setup>
	import {useRoute} from 'vue-router'
	const route =useRoute()
	console.log(route.params.id)
</script>

Vue的router学习,vue.js,学习,前端

 但是这种写法在

			<router-link to="/user/321">用户321</router-link>
			<router-link to="/user/123">用户123</router-link>

切换时不会控制台输出

如果想要改变:(很少用到)

<template>
	<h2 class="user">User:{{$route.params.id}}</h2>
</template>

<script setup>
  import { useRoute, onBeforeRouteUpdate } from 'vue-router'
 
  const route = useRoute()
  console.log(route.params.id)
 
  // 获取route跳转id
  onBeforeRouteUpdate((to, from) => {
    console.log("from:", from.params.id)
    console.log("to:", to.params.id)
  })
 
</script>

Vue的router学习,vue.js,学习,前端

 法三:

 9.notfound

对于哪些没有匹配到的路由,我们通常会匹配到固定的某个页面
 比如NotFound的错误页面中,这个时候我们可编写一个动态路由用于匹配所有的页面;

Vue的router学习,vue.js,学习,前端

 这里path:"/:patMatch(.*)"意味着匹配到所有路径

但是home/user/about这种还是会正常跳转的

	{
		path:"/:patMatch(.*)",
		component:()=>import ("../Views/NotFound.vue")
	}
<template>
	<div class="not-found">
		<h2>NotFound:您当前的路径不正确</h2>
	</div>
</template>

<script setup>

</script>

<style scoped>
</style>

Vue的router学习,vue.js,学习,前端

获得具体不正确的路径 

<template>
	<div class="not-found">
		<h2>NotFound:您当前的路径不正确{{$route.params.patMatch}}</h2>
	</div>
</template>

Vue的router学习,vue.js,学习,前端

Vue的router学习,vue.js,学习,前端

10.编程式路由跳转 

Vue的router学习,vue.js,学习,前端

使用费router-link跳转需要用到编程式

使用push的特点是压入一个新的页面,那么在用户点击返回时,上一个页面还可以回退,但是如果我们希望当前页面是一个替换操作,那么可以使用replace: 

<template>
<div class="app">
	<h2>App content</h2>
	<div class="nav">
			<span @click="homeSpanClick">首页</span>
			<button @click="aboutBtnClick">关于</button>
		</div>
	<router-view></router-view>
</div>
</template>
 
<script setup>
		import {useRouter} from 'vue-router'
		const router=useRouter()

		function homeSpanClick(){
			router.push("/home")
		}
		function aboutBtnClick()
		{
			router.push("/about")
		}
</script>
 
		import {useRouter} from 'vue-router'
		const router=useRouter()

		function homeSpanClick(){
			router.push("/home")
		}

获取当前正在使用的router 

Vue的router学习,vue.js,学习,前端

		function homeSpanClick(){
			router.push({
				path:"/home"
			})
		}

这样写可以写更多参数

Vue的router学习,vue.js,学习,前端

 11.页面的前进后退

<template>
	<h2 class="about">about</h2>
	<button @click="backBtnClick">返回</button>
</template>

<script setup>
	import {useRouter} from 'vue-router'

	const router=useRouter()
	function backBtnClick()
	{
		router.back()
	}
</script>

Vue的router学习,vue.js,学习,前端

12.动态添加路由

◼ 某些情况下我们可能需要动态的来添加路由:
 比如根据用户不同的权限,注册不同的路由;
 这个时候我们可以使用一个方法 addRoute;

let isAdmin=true
if(isAdmin)
{
	router.addRoute(	{path:"/admin",
	component:()=>import ("../Views/Admin.vue")
	},)
}

export default router

Vue的router学习,vue.js,学习,前端

//动态管理路由
let isAdmin=true
if(isAdmin)
{
	router.addRoute(	
		{path:"/admin",
		component:()=>import ("../Views/Admin.vue")
	},)
	//添加vip页面
	router.addRoute(
		{path: "/home/vip",
		component: () => import("../Views/HomeVip.vue")
	});
}

动态添加二级路由 

Vue的router学习,vue.js,学习,前端

 13.删除路由

name必须是唯一的Vue的router学习,vue.js,学习,前端

 14.路由导航守卫

◼ vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。
◼ 全局的前置守卫beforeEach是在导航触发时会被回调的:
◼ 它有两个参数:
 to:即将进入的路由Route对象;
 from:即将离开的路由Route对象;


◼ beforeEach有返回值:
 false:取消当前导航;
 不返回或者undefined:进行默认导航;
 返回一个路由地址:跳转到对应地址
✓ 可以是一个string类型的路径;
✓ 可以是一个对象,对象中包含path、query、params等信息;


◼ 可选的第三个参数:next(不推荐使用)
 在Vue2中我们是通过next函数来决定如何进行跳转的;
 但是在Vue3中我们是通过返回值来控制的,不再推荐使用next函数,这是因为开发中很容易调用多次next;

比如在首页点击order按钮,需要进行拦截,如果已经登录则放行,否则跳转到登录页面

    console.log(from,to)

Vue的router学习,vue.js,学习,前端

需求1:任何页面都跳转到login页面

// 路由导航守卫
router.beforeEach((to,from)=>
{
	if(to.path!=="/login")
	{return "/login"}
})

此处需要加条件:如果不是login页面则跳转,否则永远在跳转,陷入死循环

需求2:需求: 进入到订单(order)页面时, 判断用户是否登录

// 情况一: 用户没有登录, 那么跳转到登录页面, 进行登录的操作

// 情况二: 用户已经登录, 那么直接进入到订单页面

Vue的router学习,vue.js,学习,前端

因为第一次保存了,验证没token时需要 手动删除

模拟实现登录

点击登录后,服务器返回token接着跳转到order页面


 
<script setup>
 
 import { useRouter } from 'vue-router'
 
 const router = useRouter()

	function loginClick()
{
      // 向服务器发送请求, 服务器会返回token
      localStorage.setItem("token","codewhy")
      // 跳转到order页面
      router.push("/order")
}
 
</script>
 

退出登录

<template>
	<h2 class="home">home</h2>
	<button @click="logoutClick">退出登录</button>
</template>

<script setup>
 
  function logoutClick() {
    localStorage.removeItem("token")
  }
 
</script>

Vue还提供了很多的其他守卫函数,目的都是在某一个时刻给予我们回调,让我们可以更好的控制程序的流程或者功能:
 https://next.router.vuejs.org/zh/guide/advanced/navigation-guards.html


◼ 完整的导航解析流程:
 导航被触发。
 在失活的组件里调用 beforeRouteLeave 守卫。
 调用全局的 beforeEach 守卫。
 在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)。
 在路由配置里调用 beforeEnter。
 解析异步路由组件。
 在被激活的组件里调用 beforeRouteEnter。
 调用全局的 beforeResolve 守卫(2.5+)。
 导航被确认。
 调用全局的 afterEach 钩子。
 触发 DOM 更新。
 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。文章来源地址https://www.toymoban.com/news/detail-621262.html

到了这里,关于Vue的router学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

    路由其实是网络工程中的一个术语: 在 架构一个网络 时,非常重要的两个设备就是 路由器和交换机 。 当然,目前在我们生活中 路由器 也是越来越被大家所熟知,因为我们生活中都会用到 路由器 : 事实上, 路由器 主要维护的是一个 映射表 ; 映射表 会决定数据的流向; 路由

    2024年02月09日
    浏览(50)
  • Vue.js:Vue-Router动态路由从服务器接口获取路由数据

    文档 https://v3.router.vuejs.org/zh/installation.html 版本号 有几种方式实现动态路由: 前端配置 完整路由 ,通过接口返回的数据判断是否可显示,是否可访问 前端配置 部分路由 ,由后端接口返回的数据生成新路由 抛开路由的思维,是否能直接通过 url查询参数 或者是 动态路径参数

    2024年02月08日
    浏览(56)
  • Vue.js中如何使用Vue Router处理浏览器返回键的功能

    在Vue.js中,Vue Router默认提供了处理浏览器返回键的功能。当用户点击浏览器的返回键时,Vue Router会自动导航到历史记录中的上一个路由。然而,如果你想自定义返回键的行为或者在特定的页面上进行特殊处理,你可以使用Vue Router的导航守卫(Navigation Guards)和Vue的生命周期

    2024年04月10日
    浏览(41)
  • 【前端面经】Vue-Vue Router 路由有哪些模式?各模式有什么区别?

    Vue Router 是一个轻量级的前端路由库,它提供了三种路由模式,每种模式都适用于不同的场景。本文将详细介绍这三种模式的优缺点和适用场景,以便读者在使用 Vue Router 时进行选择。 在 hash 模式下,URL 中的 hash 值作为路由路径。该模式可以兼容较老的浏览器,并且无需后端

    2024年02月03日
    浏览(41)
  • 基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

    1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAwesome_水w的

    2024年02月02日
    浏览(71)
  • Vue的router学习

    ,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。 vue-router是基于路由和组件的  路由用于设定访问路径, 将路径和组件映射起来;  在vue-router的单页面应用中, 页面的路径的改变就是组件的切换; 使用router需要 1.在router文件夹内书写整个index.js文件 2.在

    2024年02月14日
    浏览(27)
  • 【退役之重学前端】使用vite+vue3+vue-router,重构react+react-router前后端分离的商城后台管理系统

    前言: 对前端各个技术板块,HTML、CSS、JavaScript、ES6、vue家族,整体上能“摸其大概”。笔者计划重构一个基于react的商城后台管理系统。 —— 2024年2月16日 vue3 sass bootstrap ES7 前后端分离 分层架构 模块化开发 npm vite git

    2024年02月20日
    浏览(56)
  • Vue2学习笔记のvue-router

    hello, 各位小伙伴,本文是Vue2学习笔记的第六篇:Vue-router。 路由 1.理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。 2. 前端路由:key是路径,value是组件。 1.基本使用 1.安装vue-router,命令: npm i vue-router@版本 注意:vue-router

    2024年02月11日
    浏览(32)
  • Vue3+Vue-Router+Element-Plus根据后端数据实现前端动态路由——权限管理模块

    提示:文章内容仔细看一些,或者直接粘贴复制,效果满满 提示:文章大概 1、项目:前后端分离 2、前端:基于Vite创建的Vue3项目 3、后端:没有,模拟的后端数据 4、关于路径“@”符号——vite.config.js 文件里修改 提示:以下是本篇文章正文内容,下面案例可供复制粘贴使用

    2024年02月02日
    浏览(64)
  • 前端vue中ts无法识别引入的vue文件,提示找不到xxx.vue模块的解决【引入新建页面或者通过router引入时报错】

    🌏 博客首页: 水香木鱼 📌 专栏收录:后台管理系统 📑 文章摘要: vue   typescript   vite 💌 木鱼寄语: 故木秀于林,风必摧之;堆出于岸,流必湍之;行高于人,众必非之。 提示找不到模块问题 👇 解决方案: 在 src 目录下, vite-env.d.ts 文件内新增如下代码: 在 tsco

    2024年02月13日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包