vue3路由


前言

  • 在前端ui界面的时候我们需要跳转路由的操作,用户点击不同的选项页面就会变成不同的样子,以前我们笨拙地使用后端的重定向来实现,现在我们可以通过前端vue的路由跳转来实现:用户选项时,切换路由,而路由就会让vue寻找对应的vue组件从而响应给用户。

一、路由定义

  • 狭义的路由概念:在vue3中,路由主要用于管理SPA(单页面应用)的页面跳转,使得不同的url可以映射不同的组件,无需重新加载整个页面。

二、基本示例

1.配置路由器

  • 功能:注册路由,配置映射关系,一个路由对应一个组件。

routers

// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News
        },
    ]
})
// 3.将路由器暴露
export default router

2.准备组件

  • 一般来说路由组件通常放在:pages或views的文件夹下。

News.vue

<template>
    <div>
        <p>新闻</p>
    </div>
</template>

<script>
    export default {
        name:'Home'
    }
</script>

About.vue

<template>
    <div>
        <p>关于</p>
    </div>
</template>

<script>
    export default {
        name:'Home'
    }
</script>

Home.vue

<template>
    <div>
        <p>首页</p>
    </div>
</template>

<script>
    export default {
        name:'Home'
    }
</script>

3.装入main.ts

main.ts

import {createApp} from 'vue'
import App from './App.vue'
import router from './routers/index'
// 1.获得app应用
const app = createApp(App)
// 2.将路由装入app
app.use(router)
// 3.挂载app
app.mount('#app')

4.在根组件中定义路由结构

  • 类似于超链接需要定义路由标签,但是我们在vue3中要使用预制好的标签。
  • 然后定义显示区即可。
  • 注意:不需要我们导入组件了,因为我们设置了路由,路由会自动去寻找对应的组件。
  • 注意:通过点击导航,视觉效果上“消失” 了的路由组件,默认是被卸载掉的,需要的时候再去挂载。可以利用生命周期函数来观察挂载情况。

App.vue

<template>
    <div class="app">
        <h2 class="title">Vue路由测试</h2>
        <div class="navigate">
            <!-- 使用RouterLink标签 to表示跳转的路由 active-class表示路由激活后变成的样式 -->
            <RouterLink to="/home" active-class="active">首页</RouterLink>
            <RouterLink to="/news" active-class="active">新闻</RouterLink>
            <RouterLink to="/about" active-class="active">关于</RouterLink>
        </div>
        <!-- 展示区 -->
        <div class="main-content">
            <!-- 使用RouterView标签表示能够在这块区域展示相应的组件 -->
            <RouterView></RouterView>
        </div>
    </div>
</template>

<script lang="ts" setup>
    import { RouterLink,RouterView } from 'vue-router';
</script>

三、路由器的工作模式

  • 路由器的工作模式决定了URL的显示方式路由跳转行为。
  • 路由器的工作模式分为history模式和hash模式。

history模式:

  • 优点:url更加美观,不带有#。
  • 缺点:需要和后端配合处理路径问题。
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News
        },
    ]
})

hash模式:

  • 优点:兼容性更好,还有#。
  • 缺点:需要和后端配合处理路径问题。
const router = createRouter({
    history:createWebHashHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News
        },
    ]
})

四、to的两种写法

写法1:

// 直接使用字符串
<RouterLink to="/home" active-class="active">首页</RouterLink>

写法2:

// 对象 适用于嵌套路由
<Router-link active-class="active" :to="{path:'/home'}">Home</Router-link>

五、命名路由

  • 简化跳转路由。

命名:

// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../pages/Home.vue'
import About from '../pages/About.vue'
import News from '../pages/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
        	name:'jia'
            path:'/home',
            component:Home
        },
        {
        	name:'guanyu'
            path:'/about',
            component:About
        },
        {
        	name:'xinwen'
            path:'/news',
            component:News
        },
    ]
})
// 3.将路由器暴露
export default router

引用:

<template>
    <div class="app">
        <h2 class="title">Vue路由测试</h2>
        <div class="navigate">
            <!-- 使用RouterLink标签 to表示跳转的路由 active-class表示路由激活后变成的样式 -->
            <RouterLink :to="{name:'jia'}" active-class="active">首页</RouterLink>
            <RouterLink to="{name:'xinwen'}"" active-class="active">新闻</RouterLink>
            <RouterLink to="{name:'guanyu'}" active-class="active">关于</RouterLink>
        </div>
        <!-- 展示区 -->
        <div class="main-content">
            <!-- 使用RouterView标签表示能够在这块区域展示相应的组件 -->
            <RouterView></RouterView>
        </div>
    </div>
</template>

<script lang="ts" setup>
    import { RouterLink,RouterView } from 'vue-router';
</script>

六、嵌套路由

  • 在路由中又可以嵌套另一个路由,在一个有路由的组件中再设置一层路由,然后就实现了嵌套路由。
  • 使用children标签。有可能有很多嵌套的路由,所以接收的是一个数组,同时我们需要自己定义嵌套的子路由。
  • 注意:嵌套的路由里面不要加反斜杠。
const router = createRouter({
  history:createWebHistory(),
	routes:[
		{
			name:'zhuye',
			path:'/home',
			component:Home
		},
		{
			name:'xinwen',
			path:'/news',
			component:News,
			children:[
				{
					name:'xiang',
					path:'detail',
					component:Detail
				}
			]
		},
		{
			name:'guanyu',
			path:'/about',
			component:About
		}
	]
})
export default router

七、路由传参

  • 有两种方式:query和params。
  • 直接使用编程式导航,记住就行了,再使用事件流的时候就可以直接用,不然结构和事件写在一起非常丑。
  • 现在的关系是News.vue嵌套了Detail.vue。
  • 需求:在一个路由组件接收了用户传过来的参数,然后跳转到嵌套的路由中,嵌套的路由中就可以接收传过来的参数从而作出响应。

1.query

routers

// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News,
            children:[
				{
					path:'detail',
					component:Detail,
				}
			]
        },
    ]
})
// 3.将路由器暴露
export default router

News.vue:

// 注意这时候根组件里
// 方式1:直接字符串写法 没啥意义
<Router-link to="/news/detail?a=1&b=2&content=欢迎你">
跳转
</Router-link>
// 方式2:跳转并携带query参数
<Router-link :to="{
	path:'/news/detail',
	query:{
		id:news.id,
		title:news.title,
		content:news.content
	}
}">
{{ news.title }}

Detail.vue

<template>
	<ul>
		<li>{{ id }}</li>
		<li>{{ title }}</li>
		<li>{{ content }}</li>
	</ul>
</template>
<script setup>
import {userRoute} from 'vue-router'
const route = useRoute()
// 通过route.query拿到这个函数然后进行解构
const {id,title,content} = route.query
</script>

2.params

routers

// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News,
            children:[
				{
					name:'xiang',
					path:'detail/:id/:title/:content',
					component:Detail,
				}
			]
        },
    ]
})
// 3.将路由器暴露
export default router

News.vue:

// 方法1:字符串的形式
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
				
// 方法2:对象的形式
<RouterLink 
  :to="{
    name:'xiang', //用name跳转
    params:{
      id:news.id,
      title:news.title,
      content:news.title
    }
  }"
>
  {{news.title}}
</RouterLink>

Detail.vue

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params参数
const {id, title, content} = route.params

3.区别

区别1:query配置路由时不需要占位符。
区别2:params配置路由时要占位符。
区别3:在路由组件里,params只能使用name命名,不能用path。
区别4:params不能穿数组和对象。

八、路由props

  • 刚才我们手动解构了参数,利用params我们可以不用手动解构了。

routers

// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/home',
            component:Home
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/news',
            component:News,
            children:[
				{
					name:'xiang',
					path:'detail',
					component:Detail,
					props: (route)=>{
						return route.query
					)
				}
			]
        },
    ]
})
// 3.将路由器暴露
export default router

Detail接收参数:

defineProps(['id','title','content'])

九、replace

  • 在需要跳转的RouterLink中的replace标签表示不再可以返回上次的页面跳转,不可以退栈回溯了。
  • 加上push时可以回溯。

News.vue

// 方法1:字符串的形式
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
				
// 方法2:对象的形式
<RouterLink  replace
  :to="{
    name:'xiang', //用name跳转
    params:{
      id:news.id,
      title:news.title,
      content:news.title
    }
  }"
>
  {{news.title}}
</RouterLink>

十、编程式导航

  • 可以写在一个函数里面进行跳转。
  • 也可以用router.replace()。
  • router.push和router.replace
  • route.query和route.params是获取当前路由的参数。
<template>
// 记得点击的时候如果需要传入数据给嵌套的子组件让它显示的话
// 就给它串参数
	<button @click="clickToPush({id:'1', title:'标题', content:'内容'})">点我</button>
</template>

<script setup>
import { useRouter } from 'vue-router';
const router = useRouter();
// 对象形式(推荐)
// 定义一个接口
interface INews {
	id:string,
	title:string,
	content:string
}
// 可以写在一个函数里面然后进行定义
// 同时限制类型
function clickToPush(news:INews) {
	router.push({
	  path: '/news/detail',
	  query: {
	  	  id:news.id,
	      title:news.title,
	      content:news.title
	  }
	});
}
</script>

十一、重定向

  • 在需要重定向的路由配置中加上redirect即可。
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/',
 			redirect:'/home',
        }
    ]
   

总结

  • 路由用来控制组件之间的切换以及跳转,能够在不刷新页面的情况下显示不同的组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值