【vue3】02 - vue3路由

【vue3】02 - vue3路由


在这里插入图片描述

导航栏设置路由的跳转,在vue-router中配置路由和组件的关系。

和vue2大同小异,只是语法上有些区别,对于vue2的路由部分,可以看我的这个文章

一:基本切换效果

Vue3中要使用vue-router的最新版本,目前是4版本。可以在创建脚手架的时候直接勾选vue-router

1:基本切换的实现

基本切换非常的简单:一共四个步骤:

1️⃣ 准备对应的组件,这里假设是Home.vueAbout.vue, 放到views文件夹下

<template>
  <div class="home">
    <p>{{ count }}</p>
    <button @click="add">点我加一</button>
  </div>
</template>

<script lang="ts" setup name="Home">
import { ref } from 'vue'
const count = ref(0)
console.log(count)

function add() {
  count.value++
}
</script>

<style lang="scss" scoped>

</style>
<template>
  <div class="about">
    <h1>This is an about page</h1>
    <p>{{ a }}</p>
  </div>
</template>

<script lang="ts" setup name="About">
import { ref, onMounted } from 'vue'
onMounted(() => {
  console.log('About')
})

let a = ref(1)
</script>

<style lang="scss" scoped>

</style>

2️⃣ 配置路由和组件的映射关系,在router/index.ts

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  // 使用history模式, 默认为hash模式, history没有/#
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    // 在这里配置路由和组件的映射关系
    {
      path: '/home',
      // 懒加载,避免一开始加载所有组件
      component: () => import('@/views/Home.vue'),
    },
    {
      path: '/about',
      // 懒加载,避免一开始加载所有组件
      component: () => import('@/views/About.vue'),
    },
  ],
})

export default router

3️⃣ main.ts中声明使用router, 对其进行初始化

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

// 通过 createApp 创建一个 Vue 应用程序
const app = createApp(App)

// 使用 router,对应用程序进行路由初始化
app.use(router)

// 挂载到 DOM,绑定根容器 => id=app 上(在目录的最外城index.html中,模板html文件
app.mount('#app')

4️⃣ 父组件中使用RouterLink和RouterView实现导航和展示的实现

<script setup lang="ts" name="App">
// RouterLink组件和RouterView组件
// RouterLink就是代替a标签的,如果你看了vue2的router-link非常好理解这个,就是换了个名字
// RouterView组件用于展示路由匹配到的组件
import {RouterLink, RouterView} from 'vue-router'
</script>

<!-- 结构样式部分 -->
<template>
  <div class="app">
    <h2 class="title">Vue路由测试</h2>
    <!-- 导航区 -->
    <div class="navigate">
      <RouterLink to="/home" active-class="active">首页</RouterLink>
      <RouterLink to="/about" active-class="active">关于</RouterLink>
    </div>
    <!-- 展示区 -->
    <div class="main-content">
      <!-- 假设点击了home路由,将会展示/home路由映射的vue信息 -->
      <!-- 这里会根据当前的路由展示不同的信息 -->
      <RouterView></RouterView>
    </div>
  </div>
</template>

<style scoped>
    /* css部分 */
</style>

2:注意事项

  1. 路由组件通常存放在pagesviews文件夹,一般组件通常存放在components文件夹。
  2. 通过点击导航,视觉效果上“消失” 了的路由组件,默认是被卸载掉的,需要的时候再去挂载

history模式和hash模式

history模式

  • 优点:URL更加美观,不带有#,更接近传统的网站URL
  • 缺点:后期项目上线,需要服务端配合处理路径问题,否则刷新会有404错误。
const router = createRouter({
    // 使用history模式, 默认为hash模式, history没有/#
    history: createWebHistory(import.meta.env.BASE_URL),

    // ...
}
  • vue2——mode:'history' & vue3——history:createWebHistory()

hash模式

  • 优点:兼容性更好,因为不需要服务器端处理路径。
  • 缺点:URL带有#不太美观,且在SEO优化方面相对较差。
const router = createRouter({
    history:createWebHashHistory(), //hash模式
    /******/
})

3:to的两种写法和命名路由

<!-- 第一种:to的字符串写法 -->
<router-link active-class="active" to="/home">主页</router-link>

<!-- 第二种:to的对象写法 -->
<router-link active-class="active" :to="{path:'/home'}">Home</router-link>

命名路由作用:可以简化路由跳转及传参

routes:[
    {
        name:'zhuye',
        path:'/home',
        component:Home
    },
    {
        name:'xinwen',
        path:'/news',
        component:News,
    },
    {
        name:'guanyu',
        path:'/about',
        component:About
    }
]
<!--简化前:需要写完整的路径(to的字符串写法) -->
<!--to写法(通过路径)-->
<router-link to="/news/detail">跳转</router-link>

<!--简化后:直接通过名字跳转(to的对象写法配合name属性) -->
<!--:to写法(通过名字)-->
<router-link :to="{name:'guanyu'}">跳转</router-link>
<!--:to写法(通过路径)-->
<router-link :to="{path:'/about'}">跳转</router-link>

4:嵌套路由

1️⃣ 编写子路由组件,这里以/new的子路由news/detail为例,编写一个Detail.vue

2️⃣ 编写映射关系,在news映射中,添加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

3️⃣ 路由的跳转,注意添加完整的路径信息

<router-link to="/news/detail">xxxx</router-link>
<!-- 或 -->
<router-link :to="{path:'/news/detail'}">xxxx</router-link>

4️⃣ 注意在使用位置,用RouterView预留位置

<template>
  <div class="news">
    <nav class="news-list">
      <!-- routerLink代替a标签 -->
      <RouterLink v-for="news in newsList" :key="news.id" :to="{path:'/news/detail'}">
        {{news.name}}
      </RouterLink>
    </nav>
    <!-- 根据上面的选择,获取对应的组件展示 -->
    <div class="news-detail">
      <RouterView/>
    </div>
  </div>
</template>

5:routerLink的replace模式

控制路由跳转时操作浏览器历史记录的模式。

浏览器的历史记录有两种写入方式:分别为pushreplace

  • push是追加历史记录(默认值)。
  • replace是替换当前记录。
<!-- 可以这样开启replace模式 -->
<RouterLink replace .......>News</RouterLink>

二:路由传参

其实和vue2的router都一样,就是语法上有一点点区别

1:query参数

参数的传递

<!-- 跳转并携带query参数(to的字符串写法) -->
<router-link to="/news/detail?a=1&b=2&content=欢迎你">
	跳转
</router-link>
				
<!-- 跳转并携带query参数(to的对象写法) -->
<RouterLink 
  :to="{
    //name:'xiang', //用name也可以跳转
    path:'/news/detail',
    query:{
      id:news.id,
      title:news.title,
      content:news.content
    }
  }"
>
  {{news.title}}
</RouterLink>

接收参数

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印query参数
console.log(route.query) // 通过route.query拿到对应的参数

2:param参数

参数的传递

  • 传递params参数时,若使用to的对象写法,必须使用name配置项,不能用path
  • 传递params参数时,需要提前在规则中占位。
<!-- 跳转并携带params参数(to的字符串写法) -->
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
				
<!-- 跳转并携带params参数(to的对象写法) -->
<RouterLink 
  :to="{
    name:'xiang', //用name跳转
    params:{
      id:news.id,
      title:news.title,
      content:news.title
    }
  }"
>
  {{news.title}}
</RouterLink>

接收参数

import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params参数
console.log(route.params)

3:路由的props配置

让路由组件更方便的收到参数(可以将路由参数作为props传给组件)

{
    name:'xiang',
    path:'detail/:id/:title/:content',
    component:Detail,

    // props的对象写法,作用:把对象中的每一组key-value作为props传给Detail组件
    // props:{a:1,b:2,c:3}, 

    // props的布尔值写法,作用:把收到了每一组params参数,作为props传给Detail组件
    // props:true

    // props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
    props(route){
        return route.query
    }
}

4:编程式导航传参

同vue2一样,也是提供了两个重要的属性$route$router,只不过这里变成了两个hook

尤其是router.push的使用!!

方式一:path路径跳转传参(query传参)

router.push("路由路径?参数1=参数值1&参数2=参数值2")

// 或者是下面的写法

router.push({
    path: '路由路径',
    query: {
        参数1"参数值1",
        参数2"参数值2"
    }
})

同样通过$route.query.参数名接受指定的参数

方式二:name命名路由跳转传参(query传参)

router.push({
    name: '路由名称',
    query: {
        参数1"参数值1",
        参数2"参数值2"
    }
})

// 同时在路径组件映射文件中指定name - index.js
{name: "路由名称", path: '路径', component: 组件},

总结!!

import {useRoute,useRouter} from 'vue-router'

const route = useRoute()
const router = useRouter()

console.log(route.query)
console.log(route.parmas)
console.log(router.push)
console.log(router.replace)

5:重定向和错误处理

网页打开的时候,url打开的默认是/根路径,此时如果根路径没有配置和任何组件的映射,就会产生一进入导航栏下面空白的情况

而重定向的作用就是,匹配到指定的path之后,强制跳转path的路径

可以在配置路径组件映射的js中设置重定向

{
    path:'/',
    redirect:'/about'
}

而错误处理要放到所有的最后面,然后path指定为'*'

// 一定要放在所有映射的最后面,表示前面都匹配不到了,使用这个
{
    path: '*',
    component: ErrorPage
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值