vue3 快速入门系列 —— vue3 路由

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

vue3 快速入门系列 - vue3 路由

在vue3 基础上加入路由。

vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化。

Tip:不了解路由的同学可以看一下笔者之前的文章:vue2 路由

参考:vue2 路由官网、vue3 路由官网

vue-router V4

在 Vue Router API 从 v3(Vue2)到 v4(Vue3)的重写过程中,大部分的 Vue Router API 都没有变化,但是在迁移你的程序时,你可能会遇到一些破坏性的变化 —— 从 Vue2 迁移

vue3 需要使用 vue-router 4.x.x 版本。安装:

PS hello_vue3> npm i vue-router

changed 37 packages, and audited 69 packages in 3s

8 packages are looking for funding
  run `npm fund` for details

1 moderate severity vulnerability

To address all issues, run:
  npm audit fix

Run `npm audit` for details.

版本:

"dependencies": {
    "vue": "^3.4.15",
    "vue-router": "^4.3.0"
  },

第一个示例

在vue3项目中加入路由。

步骤如下:

  • 创建路由 src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
import About from '@/views/About.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
]

// new Router 变成 createRouter
const router = createRouter({
  // mode: 'history' 配置已经被一个更灵活的 history 配置所取代
  // 必填。否则报错:Uncaught Error: Provide the "history" option when calling "createRouter()"
  history: createWebHistory(),
  routes
})

export default router

Tip:new Router 变成 createRouter 来创建路由;其中模式需要通过调用方法创建,必填

  • 创建两个组件
<template>
  <div>
    <h1>About</h1>
    // 可以通过设置router-link-active类来为被选中的路由添加样式
    <router-link to="/">to Home</router-link>
  </div>
</template>
<template>
  <div>
    <h1>Home</h1>
    <router-link to="/about">to About</router-link>
  </div>
</template>
  • App.vue 中引入 <router-view> 告诉 Vue Router 在哪里渲染匹配到的组件。
<template>
  <router-view></router-view>
</template>

<script lang="ts" setup name="App">

</script>
  • main.ts 通过 use 使用路由
import {createApp} from 'vue'
import App from './App.vue'
// 会自动加载 ./router/index.ts
import router from './router'

createApp(App)
// 将 Vue Router 插件安装到 Vue 实例中,以便在整个应用程序中使用 Vue Router 的功能
// Vue.use(MyPlugin) - 调用 `MyPlugin.install(Vue)`
.use(router)
.mount('#app')

接着就可以通过浏览器体验:

Home
// 点击,调整到 about 路由
to About
About
// 点击,调整到 home 路由
to Home

Tip: 通过 .use(router) 在 vue 开发者工具中就会看到路由tab

vue3 快速入门系列 —— vue3 路由

命名路由

Tip: vue2 路由 -> 命名路由

路径有时太麻烦,可以使用命名路由替代。

例如将 About 从路径改为名称跳转。核心代码如下:

// 定义 name
{ path: '/about', component: About, name: 'guanyu' },

// 跳转
:to="{name: 'guangyu'}"

Tip:to 目前有2种写法,感觉字符串方式很痛快,对象还需要写好多,但是到子路由或传递参数,会发现还是对象好用。

// 传递字符串 - 理解为目标路由的路径
to="/"
// 传递对象
:to="{path: '/'}"
:to="{name: 'guangyu'}"

嵌套路由

Tip:和 vue2 中路由用法相同,详情请看:vue2 路由 -> 嵌套路由

新建一个 Article 组件,里面定义一个 router-view。请看示例:

  • Article.vue
<template>
    <div>
        <h1>Article</h1>
        // path 需要将一级路由路径加上,例如 /article,不能只写 detail。该 name 也方便。
        // query 效果:http://localhost:5173/article/detail?id=1
        <router-link :to="{ path: '/article/detail', query: { id: 1 } }">文章 id1 详情</router-link><br>
        <router-link :to="{ path: '/article/detail', query: { id: 2 } }">文章 id2 详情</router-link><br>
        // 注:将对象换成字符串,效果相同
        <router-link to="/article/detail?id=3">文章 id3 详情</router-link><br>
        <router-view></router-view>
    </div>
</template>

<script lang="ts" setup name="App">
// 可以不引入
// import {RouterView,RouterLink} from 'vue-router'
</script>

Tip:可以不引入 import {RouterView,RouterLink} from 'vue-router'

  • Detail.vue
<template>
    <div>
        <h1>文章id: {{ $route.query.id }}</h1>
    </div>
</template>
  • 增加路由和子路由。子路由的 path 无需增加 /
const routes = [
  { path: '/home', component: Home,},
  {
    path: '/article',
    component: Article,
    children: [
      {
        path: 'detail',
        component: Detail
      }
    ]
  },
]
  • Home.vue 增加Article入口
<router-link :to="{name: 'guanyu'}">About</router-link>
<br>
<router-link :to="{path: '/article'}">Article</router-link>

测试:进入Home,点击 Article,点击 文章 id1 详情,显示 文章id: 1,测试通过。

路由 query 参数

在”嵌套路由“中我们是这样取得 query 参数:<h1>文章id: {{ $route.query.id }}</h1>

js 中通过 useRoute hooks 取得 $route。请看示例:

<template>
    <div>
        <h1>文章id: {{ $route.query.id }}</h1>
        <h1>文章id: {{ query.id }}</h1>
    </div>
</template>

<script lang="ts" setup name="App">
import {toRefs} from 'vue'
// 返回当前的路由地址。相当于在模板中使用 $route。
// useRouter 返回路由器实例。相当于在模板中使用 $router
import {useRoute} from 'vue-router'

const route = useRoute()

// route: Proxy
console.log('route: ', route);

// 错误:解构需要用到 toRefs,否则页面不会更新
// const {query} = route

// 正确:解构
const {query} = toRefs(route)

</script>

Tip:如果需要解构,需使用 toRefs。若想将 query.id 中的 query 去掉,可以使用后面章节的 路由 props 属性,代码将更优雅

路由 params 参数

Tip:请看 vue2 路由 -> $route.params

将上节 query 参数示例改成 params。

  • params需要增加占位符,比如:id
{
    path: '/article',
    component: Article,
    children: [
      {
        name: 'xiangxi',
        path: 'detail/:id',
        component: Detail
      }
    ]
},
  • id传递方式调整一下,不用 query 那种方式:
<router-link to="/article/detail/4">文章 id4 详情</router-link><br>
  • 接收 id
<h1>文章id: {{ $route.params.id }}</h1>

:params 不能传数组或对象;/a/:b/:c,则你必须传 /a/1/2,如果传 /a/1 则报错,如果有时没有c 可传,可以改成 /a/:b/:c?

对象形式

将 to 改成对象形式:

 <router-link :to="{
    path: '/article/detail/4',
    params: {
        id: 5
    }
}">文章 id5 详情</router-link><br>

浏览器报错更容易理解,说 path 被忽略:

// vscode 报错:
对象字面量只能指定已知属性,并且“params”不在类型“RouteLocationPathRaw”中。

// 浏览器报错
[Vue Router warn]: Path "/article/detail/4" was passed with params but they will be ignored. Use a named route alongside params instead.

将 path 改成 name即可:

<router-link :to="{
    // path: '/article/detail/4',
    name: 'xiangxi',
    params: {
        id: 5
    }
}">文章 id5 详情</router-link><br>

路由 props 属性

不就是想接收 params 或 query 传来的参数的,还得写这么一大块代码,太麻烦:

<template>
    <div>
        <h1>文章id: {{ query.id }}</h1>
    </div>
</template>

<script lang="ts" setup name="App">
import {toRefs} from 'vue'
import {useRoute} from 'vue-router'

const route = useRoute()
const {query} = toRefs(route)
</script>

可以通过 props 解决。细节如下:

props 布尔

  • 定义 props
{
    name: 'xiangxi',
    path: 'detail/:id',
    component: Detail,
    // 通过 props 属性来将路由参数传递给组件
    // 底层好些这样:<Detail id=5/>
    props: true
}
  • 直接通过 defineProps 接收
<template>
    <div>
        <h1>文章id: {{id }}</h1>
    </div>
</template>

<script lang="ts" setup name="App">
    defineProps(['id'])
</script>

props 函数

如果需要接收 query,需要用 props 函数,参数是 route,返回需要接收的对象:

// RouteLocationNormalized 是 Vue Router 中的一个类型,它用于描述路由的位置信息
import { type RouteLocationNormalized } from 'vue-router';

{
    name: 'xiangxi',
    path: 'detail',
    component: Detail,
    // 通过 props 属性来将路由参数传递给组件
    // props: true
    props(route: RouteLocationNormalized ) {
        return route.query
    }
}
  • 触发路由从 params 改成 query:
<router-link :to="{
    name: 'xiangxi',
    query: {
        id: 5
    }
}">文章 id5 详情</router-link><br>
  • 接收方式不变:
<template>
    <div>
        <h1>文章id: {{id }}</h1>
    </div>
</template>

<script lang="ts" setup name="App">
    defineProps(['id'])
</script>

Tip:其实 props: true 就相当于下面这段代码:

props(route: RouteLocationNormalized ) {
    return route.params
}

props 对象

props 还可以写成对象,但用得较少:

props: {
    id: 100
}

replace

HTML5的历史API包含了pushState(),replaceState()和popstate事件

路由默认是 push。比如启动第一个示例,未点击 home 或 about 导航时,浏览器左上方既不能前进也不能后退,因为栈中只有当前页面,指针没地方去。在你点击home和about导航后,就可以前进和后退,即使刷新页面,这个历史记录也不会变。

<router-link :to="{name: 'guanyu'}">About</router-link>
<br>
<router-link :to="{path: '/article'}">Article</router-link>

vue-router 的 replace 作用和用法和 react replace 相同。

现在点 About 就会直接替换

<router-link replace :to="{name: 'guanyu'}">About</router-link>

编程式导航

Tip:vue2 路由 -> 编程式导航

三秒后跳转到 article:

<script lang="ts" setup name="App">
import { useRouter } from 'vue-router'
const router = useRouter()

type Path = string

// 说vue2 中编程式导航重复跳转会报错,vue3中没这个问题
function to(path: Path){
  router.push(path)
}
setTimeout(() => {
  to('/article')
}, 3000)
</script>

编程式导航使用频率大于声明式导航(<router-link :to="...">

to也支持对象,和声明式导航用法相同,更多介绍请看:vuer-router v4 编程式导航

其他

路由组件和一般组件

路由组件通常放在 pages 或 views 文件夹中,一般组件通常放在 components 文件夹中 —— 一般开源的项目都会这样分类

看一个组件是哪种,需要看其如何用。比如定义一个 Demo.vue,如果通过标签 <Demo/> 这种写法来使用,就属于一般组件,如果该组件通过路由渲染,则称为路由组件。

卸载和挂载

通过导航,视觉上消失的路由组件,默认被卸载,需要用的时候在挂载。

第一个示例 中给 About.vue 增加两个生命周期钩子,再次切换 Home 和 About 组件,就能看到效果:

<template>
  <div>
    <h1>About</h1>
    <router-link to="/">Home</router-link>
  </div>
</template>

<script lang="ts" setup name="App">
import {onMounted, onUnmounted} from 'vue'
onMounted(() => {
  console.log('About 挂载了');
})
onUnmounted(() => {
  console.log('About 卸载了');
})
</script>

路由模式

history 模式 url 美观,后期上线,需要服务端配合处理路径问题,否则刷新会有404。当用户在浏览器中直接访问一个路由,或者刷新页面时,如果服务器端没有正确配置,可能会导致 404 错误,因为此时服务器会尝试去寻找对应的文件或路由路径,而实际上这个路径是由前端控制的,并不一定存在于服务器端的文件系统中。为了解决这个问题,你需要在服务器端配置一个通配符路由,将所有的路由请求都指向你的应用的入口文件(比如 index.html),这样就会确保 Vue Router 能够正确地处理路由请求。

如果你使用的是 Node.js 服务器,可以使用 Express 框架来进行配置,示例代码如下所示:

const express = require('express');
const path = require('path');
const app = express();

// 静态资源目录,例如你的 CSS、JavaScript 文件等
app.use(express.static(path.join(__dirname, 'public')));

// 通配符路由,将所有的路由请求都指向 index.html
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

// 启动服务器,监听端口
const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

这样配置后,无论用户访问哪个路由,服务器都会返回 index.html,然后 Vue Router 就可以根据路由配置来正确地渲染相应的组件,避免了刷新页面时出现的 404 错误。

Hash 模式在 SEO 优化方面相对较差。

  • 比如不利于搜索引擎爬虫:Hash 模式下,URL 中的哈希部分(#后面的内容)不会被包含在 HTTP 请求中,因此在服务器接收请求时,哈希部分对于服务器来说是不可见的。这意味着搜索引擎爬虫无法直接获取到 URL 中的实际内容,因为爬虫主要是通过 HTTP 请求获取页面内容的,所以无法获取到 hash 后面的内容,这样就会导致搜索引擎无法正确地索引和解析页面。

虽然使用 history 模式相对于 hash 模式在 SEO 优化方面有所改善,但它仍然是单页应用(SPA),可以和服务端渲染结合

没有匹配到指定的路径 /

配置如下路由,第一次打开,浏览器控制台有警告:main.ts:9 [Vue Router warn]: No match found for location with path "/"

const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About, name: 'guanyu' }
]

可以通过重定向解决。就像这样:文章来源地址https://www.toymoban.com/news/detail-845375.html

const routes = [
  { path: '/', redirect: '/home'},
  { path: '/home', component: Home,},

到了这里,关于vue3 快速入门系列 —— vue3 路由的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Vue3实战教程(快速入门)

    本教程通过搭建一个简单项目,帮助读者快速入门Vue3项目实战,掌握Vue3、TS、Element Plus、axios等技术栈。 vue -V 查看vue版本,需要在4.5.1版本之后,即可进行以下操作。 (1)使用命令 vue create vue3-elementplus-demo 创建Vue项目。 (2)进入选项配置,选择 Manually select features ,进行

    2024年02月03日
    浏览(60)
  • Vue3.0快速入门(速查)

    Vue 也是基于状态改变渲染页面, Vue 相对于 React 要好上手一点。有两种使用 Vue 的方式,可以直接导入 CDN ,也可以直接使用 CLI 创建项目,我们先使用 CDN 导入,学一些 Vue 的基本概念。 我们在实例化Vue这个对象的时候,会传入一些参数,例如 携带 v- 前缀的都叫做指令 v-i

    2024年02月08日
    浏览(27)
  • 快速入门vue3组合式API

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 使用create-vue创建项目 熟悉项目目录和关键文件  组合式API  setup选项 setup选项的写法和执行时机 script setup 语法糖 reactive和ref函数 reactive() ref() computed watch 侦听单个数据

    2024年02月12日
    浏览(35)
  • electron+vite+vue3 快速入门教程

    本文将介绍electron基本使用和构建electron+vite+vue3脚手架开发项目,带你快速入门。 Electron 是一个使用 JavaScript、HTML 和 CSS 构建桌面应用的框架。 通过将 Chromium 和 Node.js 嵌入到其二进制文件中,Electron 允许你维护一个 JavaScript 代码库并创建可在 Windows、macOS 和 Linux 上运行的跨平

    2024年01月19日
    浏览(40)
  • 【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

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

    2024年02月09日
    浏览(35)
  • 【Vue 快速入门系列】一文透彻vue中使用axios及跨域问题的解决

    Axios(ajax i/o system),是Vue创建者主推的请求发送方式,因其简单的配置与良好的性能被前端爱好者所喜爱。众所周知,在进行网页设计时经常需要从后端拿数据,在Web应用初期会将整个页面或者文档直接拿过来,随着Web应用的发展,人们对性能的不断提升,逐渐向无页面刷新

    2024年02月12日
    浏览(30)
  • Vue3 Vue-Router详解 Vue3配置hash 和 history路由、Vue3封装的路由hook函数(useRouter,useRoute)的使用 路由懒加载、路由分包处理、魔法注释的使用

     html部分 js部分  html页面使用路由传来的参数  获取router跳转id 获取 路由跳转错误地址

    2024年02月11日
    浏览(33)
  • 【vue3】vue3路由跳转的方式

    如 : 有无this都行 $router.push(\\\'/plantduce\\\') this.$router.push(\\\'/plantduce\\\') vue3 || vue2 路由参考 useRouter 与 useRoute 都可以。

    2024年02月06日
    浏览(31)
  • Vue3/ Vue3内 Vue-router Vue3路由 完整配置流程

    (1). yarn add vue-router (2) 创建 router/index.js 文件 (3) improt 引入 createRouter improt { createRouter  }  from \\\'vue-router (4) 调用 createRouter 并定义变量名  cosnt router = createRouter()  (5) export default 导出 router  export default router  (6) createRouter() 内添加对象 并定义 history    history: createMemoryHistory()

    2023年04月08日
    浏览(66)
  • vue3使用vue-router嵌套路由(多级路由)

    Vue3 嵌套路由的使用和 Vue2 相差不大,主要的区别是 Vue3 的路由实例化使用了 createApp() 方法,所以实例化路由时需要传入根组件。另外,Vue3 的路由对象除了包含 Vue2 中的导航守卫、导航钩子和解析守卫等功能外,还新增了 meta prop 和 route prop。 在使用嵌套路由时,建议将路由

    2024年02月03日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包