阅读视图

发现新文章,点击刷新页面。

最新版vue3+TypeScript开发入门到实战教程之路由详解二

上节讲解到路由的基础用法,路由的内容还有很多,这节开始路由嵌套与传参。

1、路由的嵌套

路由嵌套,简单言之,由主页点击进入一个模块,在模块中又可点击进入子模块。如在主页进入Fish组件,在Fish组件中,进入FishDetail详细内容。路由的四个基本要素

  • 路由管理器,统一管理路由
  • 路由信息,记录组件与路由的对应关系
  • 跳转标签与跳转方法,用于跳转指定路由
  • 路由跳转后,指定组件显示位置

创建一个简单实例实现嵌套路由

  • 创建主页,主页含有标题、导航、路由跳转子页面显示位置
  • 创建三个子页面,Fish、Cat、Bird
  • 创建FishDetail组件
  • 创建路由及路由信息
  • 创建Fish子路由

路由源码

import { createRouter, createWebHistory } from 'vue-router'
import Fish from '@/view/Fish.vue'
import Cat from '@/view/Cat.vue'
import Bird from '@/view/Bird.vue'
import FishDetial from '@/view/FishDetial.vue'
console.log(createRouter)
const routes = [
  {
    name: 'fish',
    path: '/fish',
    component: Fish,
    children: [
      {
        name: 'fishdetail',
        path: 'detail',
        component:FishDetial
      }
    ]
  },
  { path: '/cat', component: Cat },
  { path: '/bird', component: Bird }, // 动态路由
]
const router = createRouter({
  history: createWebHistory(),
  routes: routes,
})
export default router

App组件源码

<template>
  <div class="app">
    <router-link :to="{name:'fish'}">跳转到鱼</router-link>
    <router-link to="/cat">跳转到猫</router-link>
    <router-link to="/bird">跳转到鸟</router-link>
    <div class="content">
    <router-view></router-view>
    </div>
  </div>
</template>
<script setup lang="ts">
</script>

Fish组件源码

<template>
  <div>
    <ul>
      <li v-for="item in fishs" :key="item.id">
        <router-link :to="{path:'/fish/detail'}">{{ item.name }}</router-link>
      </li>
    </ul>
    <RouterView/>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';
let fishs = reactive([
  {id:'01',name:'鲫鱼',price:100},
  {id:'02',name:'草鱼',price:150},
  {id:'03',name:'鲈鱼',price:200},
])
</script>

FishDetal组件源码

<template>
  <div>
    <h3>鱼类:鲫鱼</h3>
    <h3>id:01</h3>
    <h3>价格:100</h3>
  </div>
</template>
<script setup lang="ts">
</script>

运行查看效果: 在这里插入图片描述

2、路由的query传参

当我们点击路由进入子页面时,希望把数据传给子页面。路由的传参,有两种方式。

  • query传参,url格式类似/fish/detail?id=01&name=鲫鱼&price=100
  • parmas传参,url格式类似/fish/detail/02/草鱼 query传参通过url地址传递给子组件,子组件通过useRoute函数接收query参数。传参实例详见Fish和FishDetail组件. Fish组件源码
<template>
  <div>
    <ul>
      <li v-for="item in fishs" :key="item.id">
        <router-link
         :to="{path:'/fish/detail',query:{id:item.id,name:item.name,price:item.price}}">{{ item.name }}</router-link>
      </li>
    </ul>
    <RouterView/>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';
let fishs = reactive([
  {id:'01',name:'鲫鱼',price:100},
  {id:'02',name:'草鱼',price:150},
  {id:'03',name:'鲈鱼',price:200},
])
</script>

FishDetail组件源码

<template>
  <div>
    <h3>鱼类:{{ route.query.name }}</h3>
    <h3>id:{{ route.query.id }}</h3>
    <h3>价格:{{ route.query.price }}</h3>
  </div>
</template>
<script setup lang="ts">
import { useRoute } from 'vue-router';
let route=useRoute();
</script>

运行实例查看效果 在这里插入图片描述 注意在FishDetail,获取到的route,是响应式。若我们从route解析获取query,将失去响应式。

<template>
  <div>
    <h3>鱼类:{{ query.name }}</h3>
    <h3>id:{{ query.id }}</h3>
    <h3>价格:{{ query.price }}</h3>
  </div>
</template>
<script setup lang="ts">
import { useRoute } from 'vue-router';
let { query } = useRoute();
</script>

如图: 在这里插入图片描述 注意url地址的变化,若要query具有相应式,可通过toRefs函数,转换为响应式。如下

let { query } = toRefs(useRoute());

3、路由的params传参

params是通过url接收参数,格式类似:fish/detail/02/草鱼/150,可通过useRoute函数获取params参数。与query不同,params必须在路由中设置对应的参数。还是以Fish与FishDetail为例,重新修改代码: 路由代码

import { createRouter, createWebHistory } from 'vue-router'
import Fish from '@/view/Fish.vue'
import Cat from '@/view/Cat.vue'
import Bird from '@/view/Bird.vue'
import FishDetial from '@/view/FishDetial.vue'
console.log(createRouter)
const routes = [
  {
    name: 'fish',
    path: '/fish',
    component: Fish,
    children: [
      {
        name: 'fishdetail',
        path: 'detail/:id/:name/:price?',
        component:FishDetial
      }
    ]
  },
  { path: '/cat', component: Cat },
  { path: '/bird', component: Bird }, // 动态路由
]
const router = createRouter({
  history: createWebHistory(),
  routes: routes,
})
export default router

Fish组件代码

<template>
  <div>
    <ul>
      <li v-for="item in fishs" :key="item.id">
        <router-link
         :to="{name:'fishdetail',params:{id:item.id,name:item.name,price:item.price}}">{{ item.name }}</router-link>
      </li>
    </ul>
    <RouterView/>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';
let fishs = reactive([
  {id:'01',name:'鲫鱼',price:100},
  {id:'02',name:'草鱼',price:150},
  {id:'03',name:'鲈鱼',price:200},
])
</script>

FishDetail组件代码

<template>
  <div>
    <h3>鱼类:{{ route.params.name }}</h3>
    <h3>id:{{ route.params.id }}</h3>
    <h3>价格:{{ route.params.price }}</h3>
  </div>
</template>
<script setup lang="ts">
import { useRoute } from 'vue-router';
let route = useRoute();
</script>

运行实例查看params 在这里插入图片描述 注意两点:

  • router-link使用跳转路由时,用的是name,而不能用path
  • router-link传递参数不能数组
  • 在路由配置中price后有问号,代表这个参数可不用传递 若不使用name,可以通过下面代码跳转:
<template>
  <div>
    <ul>
      <li v-for="item in fishs" :key="item.id">
        <router-link :to="`/fish/detail/${item.id}/${item.name}`">{{item.name  }}</router-link>
      </li>
    </ul>
    <RouterView/>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';
let fishs = reactive([
  {id:'01',name:'鲫鱼',price:100},
  {id:'02',name:'草鱼',price:150},
  {id:'03',name:'鲈鱼',price:200},
])
</script>

其实to后面就是字符串拼接。

最新版vue3+TypeScript开发入门到实战教程之路由详解

1、概述

网站是有许多单页面组成,页面并非孤立,而是可以相互跳转。以下是官网给的定义: Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。它的核心价值在于:在不刷新页面的情况下,根据 URL 的变化动态渲染不同的组件,实现流畅的页面切换体验。 假设网站有四个页面,主页,a、b、c,网站可以从主页分别跳转到a、b、c是三个页面。也可跳回主页。这些跳转信息,称作路由信息,管理路由信息完成跳转称作路由器。路由四大要素:

  • 路由管理器,统一管理路由
  • 路由信息,记录组件与路由的对应关系
  • 跳转标签与跳转方法,用于跳转指定路由
  • 路由跳转后,指定组件显示位置

2、 基本路由导航实例

  • 创建主页,主页含有标题、导航、路由跳转子页面显示位置
  • 创建三个子页面,Fish、Cat、Bird
  • 创建路由器,挂载路由器
  • 创建路由信息

2.1创建路由器、路由信息、挂载路由器

2.1.1创建路由器、路由信息

const routes = [
  { path: '/fish', component: Fish },
  { path: '/cat', component: Cat },
  { path: '/bird', component: Bird }  // 动态路由
]
const router = createRouter(
  {
    history: createWebHistory(),
    routes: routes
  }
)

路由信息routes,注意routerroutes区别。routes包含path与component。

  • path是路径,浏览器地址,url如:http://localhost:5173/bird,访问bird页面
  • component组件,路径path对应的组件 路由器的创建,包含路由信息与history。history有两种模式:
  • createWebHistory。传统模式,url美观,seo友好
  • createWebHashHistory 。hash模式,url地址含有#,不美观,兼容性好

2.1.2挂载路由器

挂载路由器,要在创建vue实例后,挂载路由。vue实例是在main.ts中创建。

const app = createApp(App)
app.use(router)
app.mount('#app')

2.2路由基本切换效果

在这里插入图片描述

首先打开页面,框内为空。分别点击按钮,跳转到响应页面,内容出现在边框内,注意url地址变化。

2.2.1 目录文件结构

在这里插入图片描述

2.2.2 main.ts源码

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'
const app = createApp(App)
app.use(router)
app.mount('#app')

2.2.1 router/index.ts源码

import { createRouter,createWebHistory } from "vue-router";
import Fish from "@/view/Fish.vue";
import Cat from "@/view/Cat.vue";
import Bird from "@/view/Bird.vue";
console.log(createRouter);
const routes = [
  { path: '/fish', component: Fish },
  { path: '/cat', component: Cat },
  { path: '/bird', component: Bird }  // 动态路由
]
const router = createRouter(
  {
    history: createWebHistory(),
    routes: routes
  }
)
export default router;

2.2.1 App源码

<template>
  <div class="app">
    <router-link to="/fish">跳转到鱼</router-link>
    <router-link to="/cat">跳转到猫</router-link>
    <router-link to="/bird">跳转到鸟</router-link>
    <div class="content">
    <router-view></router-view>
    </div>
  </div>
</template>
<script setup lang="ts">
</script>

2.2.1 Fish、cat、Bird源码

Fish

<template>
  <div>
    <h1>会游泳的鲫鱼</h1>
  </div>
</template>
<script setup lang="ts">
</script>

Cat

<template>
  <div>
    <h1>爱吃老鼠的猫</h1>
  </div>
</template>
<script setup lang="ts">
</script>

Bird

<template>
  <div>
    <h1>翱翔天空的小鸟</h1>
  </div>
</template>
<script setup lang="ts">
</script>

2.3路由的两个注意点

  • 路由组件,如Fish、Cat等,应存放在pages或者views文件夹内,而非components文件夹内
  • 点击导航按钮,路由的切换,是旧页面组件的销毁,新页面组件创建的过程。

3、路由的工作模式

路由的工作模式有两种,在创建路由时,必须给定模式 -history -hash history是传统模式,优点是URL更加美观,更接近传统网站URL。缺点是后期项目上线,后台服务器需配合处理路径问题,否则报404错误。一般用history较多,如b站。 hash兼容性更好,不需要服务器后台处理路径问题。缺点是url带有#,不美观,且SEO优化方面差,后端项目常用。 以下是hash实例,与history不同之处在创建路由时,用createWebHashHistory 函数指定hash模式: router/index.ts代码

import { createRouter,createWebHashHistory } from "vue-router";
import Fish from "@/view/Fish.vue";
import Cat from "@/view/Cat.vue";
import Bird from "@/view/Bird.vue";
console.log(createRouter);
const routes = [
  { path: '/fish', component: Fish },
  { path: '/cat', component: Cat },
  { path: '/bird', component: Bird }  // 动态路由
]
const router = createRouter(
  {
    history: createWebHashHistory(),
    routes: routes
  }
)
export default router;

运行效果: 在这里插入图片描述 注意路径带有#

4、路由跳转To的三种用法与路由命名

router-link有三种用法,以跳转为例Fish,重新配置Fish组件路由信息,给Fish路由命名为yu。 如下:{ name:'yu',path: '/fish', component: Fish }。 router-link有三种方式可以跳转到Fish组件

    <router-link :to="{name:'yu'}">跳转到鱼</router-link>
    <router-link :to="{path:'fish'}"">跳转到鱼</router-link>
    <router-link :to="/fish">跳转到鱼</router-link>

三种跳转方式各有利弊,常用第二种方式,便于路由传参。

❌