当前位置: 首页 > news >正文

vue3路由基本使用

在 Vue 3 中,路由指的是应用程序的导航系统,允许你在不同的视图或页面之间进行切换。通过 vue-router 插件,你可以定义路由规则,将 URL 路径映射到 Vue 组件,实现页面间的跳转和状态管理。使用路由,用户可以在应用中导航不同的视图,同时保持浏览器的历史记录。

一 路由的基本使用

1. 安装 vue-router

npm install vue-router@next

2. 创建路由配置

定义路由配置通常在一个单独的文件中完成,例如 router/index.js 或 router/index.ts。配置包括路径、组件和其他路由属性:

import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import About from '../views/About.vue';const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
];const router = createRouter({history: createWebHistory(),routes
});export default router;

3. 在应用中使用路由

在你的 Vue 应用中,通常会在 main.js 或 main.ts 中使用 router 实例:

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

4. 路由视图

使用 组件在你的模板中展示路由匹配的组件。这个组件充当路由占位符:

<script lang="ts" setup name="App">import {RouterLink,RouterView} from 'vue-router'  
</script>
<template><div><router-view></router-view></div><RouterLink to="/home" active-class="active">首页</RouterLink>
</template>

5 命名路由

命名路由允许你为每个路由定义一个唯一的名称,方便在应用中引用和导航。定义命名路由时,你可以在路由配置中为每个路由指定一个 name 属性

  • 在路由配置中为每个路由指定 name 属性:
const routes = [{path: '/home',name: 'Home',component: HomeComponent},{path: '/about',name: 'About',component: AboutComponent}
];
  • 使用 组件时,可以通过 :to 属性的对象形式来引用命名路由:
<router-link :to="{ name: 'Home' }">Home</router-link>
<router-link :to="{ name: 'About' }">About</router-link>
  • 编程式导航
import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();function goToHome() {router.push({ name: 'Home' });}return { goToHome };}
};
  • 带参数的命名路由

当路由需要参数时,可以在 :to 对象中添加 params 属性:

<router-link :to="{ name: 'UserProfile', params: { id: 123 } }">User Profile</router-link>

编程式导航时也可以传递参数:

router.push({ name: 'UserProfile', params: { id: 123 } });

6 嵌套路由

嵌套路由允许你在一个路由中定义子路由,从而构建层级结构的页面。这样可以在一个页面内展示多个视图或组件。

  • 定义嵌套路由

在路由配置中,将子路由定义在父路由的 children 属性下:

const routes = [{path: '/dashboard',component: DashboardLayout,children: [{path: '',name: 'DashboardHome',component: DashboardHome},{path: 'settings',name: 'DashboardSettings',component: DashboardSettings}]}
];

7 路由重定向

路由重定向的作用是自动将用户从一个路径引导到另一个路径。它可以用于以下几种情况:

  • 默认路径:例如,将根路径 / 重定向到主页 /home。
{path:'/',redirect:'/about'
}
  • 旧路径更新:将旧的或过时的路径重定向到新的路径,以保持链接的有效性。
  • 权限控制:将用户重定向到登录页面,如果他们尝试访问受限区域而未登录。

二 路由的操作

1. 导入 useRouter 和 useRoute

在 Vue 3 中,你需要从 vue-router 导入 useRouter 和 useRoute,这两个函数提供了对路由实例和当前路由信息的访问。

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

2. 进行路由导航

使用 useRouter 来执行路由导航操作。例如,你可以在组件中定义方法来进行导航:

export default {setup() {const router = useRouter();function goToHome() {router.push('/');}function goToUserProfile(userId) {router.push({ name: 'user-profile', params: { id: userId } });}return { goToHome, goToUserProfile };}
};

3. 访问当前路由信息

使用 useRoute 来访问当前路由的信息,如路径、查询参数和动态路由参数:

export default {setup() {const route = useRoute();console.log(route.path);  // 当前路由的路径console.log(route.params.id);  // 动态路由参数console.log(route.query.search);  // 查询参数return { route };}
};

4. 路由守卫

你可以在 setup 函数中使用 onBeforeRouteEnter 和 onBeforeRouteUpdate 进行路由守卫:

import { onBeforeRouteEnter, onBeforeRouteUpdate } from 'vue-router';export default {setup() {onBeforeRouteEnter((to, from, next) => {// 在路由进入之前执行的逻辑if (/* 条件 */) {next();} else {next('/login');}});onBeforeRouteUpdate((to, from, next) => {// 在路由更新之前执行的逻辑if (/* 条件 */) {next();} else {next('/error');}});}
};

5. 使用路由钩子

你可以在 setup 函数中使用 Vue 的生命周期钩子来处理路由相关的逻辑:

import { onMounted } from 'vue';
import { useRoute } from 'vue-router';export default {setup() {const route = useRoute();onMounted(() => {console.log('Current route path:', route.path);// 处理路由信息});return { route };}
};

6. 监听路由变化

使用 watch API 监听路由变化并响应:

import { watch } from 'vue';
import { useRoute } from 'vue-router';export default {setup() {const route = useRoute();watch(() => route.params.id,(newId, oldId) => {console.log(`Route parameter ID changed from ${oldId} to ${newId}`);// 执行需要根据路由变化更新的逻辑});return { route };}
};

7. 路由懒加载

通过懒加载组件来提高应用的性能:

const UserProfile = () => import('../components/UserProfile.vue');const routes = [{path: '/user/:id',name: 'user-profile',component: UserProfile}
];

8. 使用路由元信息

路由元信息可以用于存储额外的信息,例如权限检查:

const routes = [{path: '/admin',component: AdminComponent,meta: { requiresAuth: true }}
];// 在路由守卫中检查元信息
import { onBeforeRouteEnter } from 'vue-router';export default {setup() {onBeforeRouteEnter((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated()) {next('/login');} else {next();}});}
};

三 路由的两种工作模式

1 history模式

  1. 工作原理

history模式利用 HTML5 的 History API (pushState, replaceState, 和 popState 事件) 来管理路由。浏览器的 URL 不包含 # 符号,而是直接显示路由的路径部分。需要对服务器进行配置,以确保所有路由请求都返回应用的入口 HTML 文件。

  1. 优点
  • 更清晰的 URL:没有 # 符号,URL 更加整洁和符合标准。
  • 支持更复杂的功能:支持浏览器的前进、后退功能,与传统的浏览器行为一致。
  1. 缺点
  • 需要服务器配置:必须配置服务器以处理路由,避免 404 错误。
  1. 示例
import { createRouter, createWebHistory } from 'vue-router';const routes = [{ path: '/', component: Home },{ path: '/about', component: About },
];const router = createRouter({history: createWebHistory(),routes,
});export default router;

5 URL 示例

  • 首页:http://example.com/
  • 关于页:http://example.com/about

2 hash模式

  1. 工作原理

哈希模式使用 URL 的 # 符号后面的部分来表示路由状态。浏览器不会将 # 后面的部分发送到服务器,所有的路由切换都在客户端完成。

  1. 优点
  • 兼容性:几乎所有浏览器都支持哈希模式,且不需要额外的服务器配置。
  • 简单:无需配置服务器即可处理路由。
  1. 缺点
  • URL 显得不美观:URL 中包含 # 符号,这可能会影响用户体验和 SEO。
  • 某些功能限制:如部分工具或库可能对哈希 URL 的支持较差。
  1. 示例
import { createRouter, createWebHashHistory } from 'vue-router';const routes = [{ path: '/', component: Home },{ path: '/about', component: About },
];const router = createRouter({history: createWebHashHistory(),routes,
});export default router;
  1. URL 示例

首页:http://example.com/#/
关于页:http://example.com/#/about

四 路由传参

1 query参数

  • 定义路由

Query 参数不需要在路由定义中做特别设置:

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Search from '@/components/Search.vue';const routes = [{path: '/search',component: Search}
];const router = createRouter({history: createWebHistory(),routes
});export default router;
  • 访问 Query 参数

在组件中,使用 useRoute 来访问查询参数:

<template><div><h1>Search Query: {{ query }}</h1></div>
</template><script>
import { computed } from 'vue';
import { useRoute } from 'vue-router';export default {setup() {const route = useRoute();const query = computed(() => route.query.q);return { query };}
}
</script>
  • 路由跳转

使用 useRouter 进行跳转并传递查询参数:

<template><button @click="search('vue')">Search for Vue</button>
</template><script>
import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();function search(query) {router.push({ path: '/search', query: { q: query } });}return { search };}
}
</script>

2 params参数

  • 定义路由

首先,设置带有路径参数的路由:

// router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import User from '@/components/User.vue';const routes = [{path: '/user/:id',component: User}
];const router = createRouter({history: createWebHistory(),routes
});export default router;
  • 访问 Path 参数

在组件中,使用 useRoute 来访问路径参数:

<template><div><h1>User ID: {{ userId }}</h1></div>
</template><script>
import { computed } from 'vue';
import { useRoute } from 'vue-router';export default {setup() {const route = useRoute();const userId = computed(() => route.params.id);return { userId };}
}
</script>
  • 路由跳转

使用 useRouter 进行跳转并传递路径参数:

<template><button @click="goToUser(123)">Go to User 123</button>
</template><script>
import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();function goToUser(id) {router.push(`/user/${id}`);}return { goToUser };}
}
</script>
  • 总结

params参数 是在路由路径中定义的动态部分(如 /user/:id),在 URL 中直接显示,通常用于标识资源的唯一性。在组件中,通过 useRoute 访问 route.params 来获取这些参数。

query参数 是附加在 URL 末尾的键值对(如 /search?q=vue),用于传递额外的过滤或搜索条件。在组件中,通过 useRoute 访问 route.query 来获取这些参数。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • leetcode练习 子集II
  • uni-app实现web-view和App之间的相互通信
  • 思维训练900
  • windows系统安装docker
  • PostgreSQL - tutorial
  • TCP Analysis Flags 之 TCP ZeroWindow
  • 原型模式详细介绍和代码实现
  • 人工智能浪潮下,程序员如何锻造不可替代的核心竞争力?
  • Remix 学习 - @remix-run/react 中的主要组件
  • Maven 常见问题以及常用命令
  • 熵权法详细讲解+Python代码实现
  • RNN股票预测(Pytorch版)
  • 【AI视频】复刻抖音爆款AI数字人作品初体验
  • TS - tsconfig.json 和 tsconfig.node.json 的关系,如何在TS 中使用 JS 不报错
  • 【Petri网导论学习笔记】Petri网导论入门学习(三)
  • 2017-09-12 前端日报
  • angular2 简述
  • co.js - 让异步代码同步化
  • ES6系列(二)变量的解构赋值
  • Fastjson的基本使用方法大全
  • jdbc就是这么简单
  • magento 货币换算
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Swift 中的尾递归和蹦床
  • Vue 动态创建 component
  • Yeoman_Bower_Grunt
  • 分享一份非常强势的Android面试题
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 深入 Nginx 之配置篇
  • 一起参Ember.js讨论、问答社区。
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • UI设计初学者应该如何入门?
  • 正则表达式-基础知识Review
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ###项目技术发展史
  • #、%和$符号在OGNL表达式中经常出现
  • #pragma once
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (翻译)terry crowley: 写给程序员
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)elasticsearch 源码之启动流程分析
  • (实战篇)如何缓存数据
  • (图)IntelliTrace Tools 跟踪云端程序
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (学习日记)2024.02.29:UCOSIII第二节
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .net 反编译_.net反编译的相关问题