vue-router(vue 路由)基本使用指南(二)

vue-router(vue 路由)基本使用指南(二)

文章目录

深入使用

导航守卫

导航守卫用于在路由跳转前、跳转后或解析过程中,添加自定义的逻辑处理,例如权限验证。

    • tofrom 是即将进入的目标路由和当前导航正要离开的路由
    • next 是一个函数,该函数用于控制路由的跳转。
    • next():继续执行路由。
    • next(false):中断当前路由,如果浏览器的 URL 改变了,那么 URL 会回到 from 路由。
    • next(‘/path’):跳转到指定路径。
    • next(error):将控制权交给 router.onError()

组件内守卫

exportdefault{beforeRouteEnter(to,from, next){// 在路由进入前调用next();},beforeRouteUpdate(to,from, next){// 在当前路由改变,但组件被复用时调用next();},beforeRouteLeave(to,from, next){// 在路由离开前调用next();},};

路由独享守卫

const routes =[{ path:'/admin', component: Admin,beforeEnter:(to,from, next)=>{// 仅管理员可访问if(isAdmin()){next();}else{next('/login');}},},];

全局后置钩子全局后置钩子通过 router.afterEach 方法设置,它不会接收 next 函数也不会改变导航本身:

router.afterEach((to,from)=>{// 在这里你可以访问路由守卫结束后的状态,但不能改变状态。 console.log('路由已切换');// 例如,记录日志或者统计页面访问等。});

全局解析守卫全局解析守卫通过 router.beforeResolve 方法设置,它在所有组件内守卫和异步路由组件被解析之后调用。

router.beforeResolve((to,from, next)=>{// 类似于 beforeEach,但是在这个守卫中,所有组件内守卫和异步路由组件被解析之后调用。});

全局前置守卫

router.beforeEach((to,from, next)=>{// 例如,验证用户是否已登录if(to.path ==='/protected'&&!isLoggedIn()){next('/login');// 跳转到指定路径}else{next();// 继续执行路由}});

## 嵌套路由

嵌套路由用于构建具有层级关系的页面结构,即在一个组件内部再嵌套另一个路由视图。

详见:传送门

在父组件模板中

<template> <div> <h2>用户页面</h2> <router-view></router-view> <!-- 渲染子路由组件 --> </div> </template> 

定义嵌套路由

const routes =[{ path:'/user', component: User, children:[{// 当/user/profile匹配成功,UserProfile将被渲染到User的<router-view>内部 path:'profile', component: UserProfile,},{ path:'posts', component: UserPosts,},],},];

注意,以 / 开头的嵌套路径将被视为根路径。这允许你利用组件嵌套,而不必使用嵌套的 URL

重定向与别名

重定向:也是通过 routes 配置来完成

    • 导航守卫并没有应用在跳转路由上,而仅仅应用在其目标上。在上面的例子中,在 /home 路由中添加 beforeEnter 守卫不会有任何效果。
    • 在写 redirect 的时候,可以省略 component 配置,因为它从来没有被直接访问过,所以没有组件要渲染。唯一的例外是嵌套路由:如果一个路由记录有 childrenredirect 属性,它也应该有 component 属性。

相对重定向:重定向到相对位置

const routes =[{// 将总是把/users/123/posts重定向到/users/123/profile。 path:'/users/:id/posts',redirect:to=>{// 该函数接收目标路由作为参数return to.path.replace(/posts$/,'profile')},},]

示例:

const routes =[{ path:'/home', redirect:'/'}]const routes =[{ path:'/home', redirect:{ name:'homepage'}}]const routes =[{// /search/screens -> /search?q=screens path:'/search/:searchText',redirect:to=>{// 方法接收目标路由作为参数// return 重定向的字符串路径/路径对象return{ path:'/search', query:{ q: to.params.searchText }}},},{ path:'/search',// ...},]

注意

别名

如果路由有参数,需确保在任何绝对别名中包含它们:

const routes =[{ path:'/users/:id', component: UsersByIdLayout, children:[// 为这3个URL(/users/24、/users/24/profile、/24)呈现 UserDetails{ path:'profile', component: UserDetails, alias:['/:id','']},],},]

通过别名,可以自由地将 UI 结构映射到一个任意的 URL,而不受配置的嵌套结构的限制。使别名以 / 开头,以使嵌套路径中的路径成为绝对路径。甚至可以将两者结合起来,用一个数组提供多个别名:

const routes =[{ path:'/users', component: UsersLayout, children:[// 为这3个URL(/users、/users/list、/people)呈现 UserList{ path:'', component: UserList, alias:['/people','list']},],},]

/ 别名为 /home,意味着当用户访问 /home 时,URL 仍然是 /home,但会被匹配为用户正在访问 /重定向是指当用户访问 /home 时,URL 会被 / 替换,然后匹配成 /

const routes =[{ path:'/', component: Homepage, alias:'/home'}]

history 配置:指定历史模式

    • 内部传递的实际 URL 之前会加一个井号(#)(如 http://example.com/#/home
    • 无需服务器配置(所有URL,包括是不存在的,都不会被发送到服务器),适合纯前端单页应用(SPA)
    • 不过,它在 SEO 中确实有不好的影响。如果担心这个问题,可以使用 HTML5 模式。
  • createWebHistory():history 模式 / HTML5 模式
    • url 更简洁(如 http://example.com/home),无 #
    • 需要服务器支持(避免 404 错误,需配置回退到 index.html
    • 适合需要 seo 或对 url 美观有要求的项目:
  • createMemoryHistory():Memory 模式
    • Memory 模式不会假定自己处于浏览器环境,因此不会与 URL 交互也不会自动触发初始导航
    • 需要在调用 app.use(router) 之后手动 push 到初始导航
    • 虽然不推荐,但仍可以在浏览器应用程序中使用此模式注意:它不会有历史记录,这意味着无法后退或前进
    • 非常适合 Node 环境和 SSR

createWebHashHistory():Hash 模式(默认模式)

import{ createRouter, createWebHashHistory }from'vue-router'const router =createRouter({ history:createWebHashHistory(), routes:[...],})

路由元信息(meta)

路由配置中可以添加元信息(meta),例如权限控制、页面标题等。

全局导航守卫中使用:

router.beforeEach((to,from)=>{if(to.meta.requiresAuth &&!isAuthenticated()){return{ name:'Login'};}});

获取元信息:

<script setup>import{ useRoute }from'vue-router';const route =useRoute(); console.log(route.meta.title);// "控制面板"</script>

路由配置:

const routes =[{ path:'/dashboard', name:'Dashboard', component: Dashboard, meta:{ requiresAuth:true, title:'控制面板'}}];

拓展

状态管理(Pinia / Vuex)

Pinia / Vuex 介绍

对于复杂或跨页面的数据传递,推荐使用状态管理库(Pinia/Vuex)。

  • Vuex:Vuex 是 Vue.js 官方的状态管理库。采用了 Flux 的思想,提供了一个集中式存储,允许组件以不同的方式共享状态。核心概念:
    • State: 应用的状态存储。
    • Getters: 类似于计算属性,用于计算基于状态的派生状态。
    • Mutations: 处理状态的唯一方式,直接修改状态。
    • Actions: 进行异步操作,并提交 Mutations。
  • Pinia:Pinia 是一个新兴的状态管理库,也是 Vue.js 的官方推荐替代方案。它为 Vue 3 提供了一种更简单、更具灵活性的状态管理方式与 Vuex 相比,Pinia 在设计上更现代化,支持 Composition API,使得开发者在使用时更加方便。核心概念:
    • Store: 状态存储的基本单位,通过建立一个或多个 Store 来管理状态。
    • State: 用于保存应用的响应式状态。
    • Getters: 计算属性的延伸,基于状态计算派生值。
    • Actions: 包含了执行异步操作的行为和直接修改状态的方法。

Vuex vs Pinia

  • API 和易用性
    • Vuex:采用认证的 Flux 风格,有一定的学习曲线,需要掌握多个概念(状态、getter、mutation、action)。对于小型应用来说,可能会显得过于复杂。
    • Pinia:设计更为简单,结合了 Composition API,让开发者能够更直观地管理状态。尤其是 Vue 3 的 Setup 语法糖,使用更加直观。
  • 响应式
    • Vuex:响应式总是要依赖于 Vue 的响应式系统,并且有多种约定(例如 Mutation),使用中需要更小心。
    • Pinia:完全基于 Vue 3 的响应式系统,状态变化后组件自动更新,无需额外的处理。
  • DevTools 支持
    • Vuex:在 Vue DevTools 中支持非常好,可以很方便地进行状态的查看和时间旅行调试。
    • Pinia:同样也支持 Vue DevTools,且整体使用体验更友好。
  • 社区支持和生态
    • Vuex:由于是官方库,资料和插件相对丰富,很多现有的项目都是基于 Vuex 的。
    • Pinia:作为新兴库,其社区支持还在不断扩大,函数式编程风格吸引了一部分开发者,但整体生态仍需时间发展。

总结

Vuex 和 Pinia 各有优缺点,选择哪个库取决于你的项目需求和个人偏好。如果你正在开发一个较大型的应用,且已有 Vuex 的使用经验,那么继续使用 Vuex 可能是一个不错的选择。而如果你想要尝试一种更简单、现代化的方式,那么 Pinia 无疑是个值得尝试的选项。

Pinia 基本使用

    • pinia-plugin-persistedstate 为 pinia 的数据持久化插件

使用 Pinia

<template> <div> <p>Count: {{ count }}</p> <p>Double Count: {{ doubleCount }}</p> <button @click="increment">Increment</button> <button @click="incrementAsync">Increment Async</button> </div> </template> <script setup lang="ts"> import {computed} from "vue"; import {useUserStore} from '@/utils/store.js'; const counterStore = useUserStore() const count = computed(() => counterStore.count) const doubleCount = computed(() => counterStore.doubleCount) const increment = () => { counterStore.increment() } const incrementAsync = async () => { await counterStore.incrementAsync() } </script> 

创建一个 Store

// store.jsimport{ defineStore }from'pinia';exportconst useCounterStore =defineStore('counter',{state:()=>({ count:0,}), getters:{doubleCount(state){return state.count *2;},}, actions:{increment(){this.count++;},asyncincrementAsync(){awaitnewPromise((resolve)=>setTimeout(resolve,1000));this.count++;},}, persist:{ enabled:true,// 启用持久化 storage: window.localStorage,// 存储到 localStorage(默认)/sessionStorage},});

main.tsmain.js 中初始化

import{ createApp }from'vue';import{ createPinia }from'pinia';import{ createPersistedState }from'pinia-plugin-persistedstate';const app =createApp(App);// 将状态管理器 pinia装入appconst pinia =createPinia(); pinia.use(createPersistedState());// 开启状态持久化 app.use(pinia); app.mount('#app');

安装 Pinia

npminstall pinia pinia-plugin-persistedstate 

Pinia 使用 Cookies 存储

虽然Cookies主要用于存储少量数据,并且有大小限制(通常为4KB),但在某些情况下,也可以用于简单的持久化。

使用 Cookies 进行持久化时,需要手动处理数据的读写:

exportconst useUserStore =defineStore('user',{state:()=>({ name:null, age:null,}), actions:{setName(name){this.name = name; document.cookie =`name=${name}; path=/; max-age=3600`;},getName(){const name = document.cookie.split('; ').find(row=> row.startsWith('name='));if(name){this.name = name.split('=')[1];}},},});

Read more

UltraISO注册码最新版分享 + 制作GLM-4.6V-Flash-WEB启动盘教程

UltraISO注册码最新版分享 + 制作GLM-4.6V-Flash-WEB启动盘教程 在人工智能加速落地的今天,一个越来越现实的需求浮出水面:如何让复杂的多模态大模型摆脱“实验室玩具”的标签,真正走进会议室、教室甚至工厂车间?答案或许就藏在一个小小的U盘里。 设想这样一个场景:你带着一个16GB的U盘走进客户办公室,插入一台普通笔记本电脑,重启后进入系统,打开浏览器,几秒内就能调用具备图文理解能力的大模型进行实时推理——无需联网、无需安装驱动、更不需要花三天时间配置Python环境。这听起来像科幻?其实已经可以做到。关键就在于两个技术的结合:轻量化视觉大模型 GLM-4.6V-Flash-WEB 与 UltraISO 启动盘制作技术。 GLM-4.6V-Flash-WEB:为“即插即用”而生的视觉AI引擎 智谱AI推出的这款模型,并非追求参数规模上的极致突破,而是精准瞄准了工业级部署中的核心痛点:延迟高、部署难、集成弱。它属于GLM-V系列中专为Web服务优化的“闪电版”,名字里的“Flash”不只是营销术语,而是实打实的技术承诺——平均推理响应控制在200ms以内(512

By Ne0inhk
【Java Web学习 | 第四篇】CSS(3) -背景

【Java Web学习 | 第四篇】CSS(3) -背景

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * CSS背景样式全解析🥝 * 4.1 背景颜色 (`background-color`) * 4.2 背景图片 (`background-image`) * 4.3 背景平铺 (`background-repeat`) * 4.4 背景图片位置 (`background-position`) * 4.5 背景图像固定 (`background-attachment`) * 4.6 背景属性复合写法 * 4.7 背景色半透明 (`rgba`) * 综合代码演示 * 学习资源推荐🐦‍🔥 CSS背景样式全解析🥝 在网页设计中,背景样式是塑造页面视觉效果的关键元素之一。通过CSS的背景属性,我们可以为页面添加丰富的视觉效果,包括背景颜色、背景图片、平铺方式、定位以及固定等。

By Ne0inhk
C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

C++ 方向 Web 自动化测试入门指南:从概念到 Selenium 实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 自动化测试基础:先搞懂"为什么"和"做什么" * 1.1 自动化测试的核心目标:回归测试 * 1.2 自动化测试分类:别把 “不同自动化” 混为一谈 * 1.3 自动化测试金字塔:如何分配测试资源? * 二. Web 自动化测试核心:环境搭建与驱动管理 * 2.1 核心组件原理:三者如何协同工作? * 2.2 环境搭建:3 步搞定依赖安装

By Ne0inhk
一位过来人的 Web 前端开发全维准备指南

一位过来人的 Web 前端开发全维准备指南

真正拉开开发者差距的,不是敲下第一行代码的速度,而是动笔之前思维框架的深度。 在这个数字化渗透进每个角落的时代,Web 前端开发早已不是当年那个“切图仔”的简单活儿。它是连接用户与数字世界的桥梁,是产品体验的灵魂载体,更是一门融合了艺术感性与工程理性的复杂学科。当无数零基础的学习者怀揣着改变职业轨迹的梦想,准备敲下人生第一个 <html> 标签时,我想邀请你们稍作停留。 本文不急于教你如何写代码,而是希望与你深入探讨:在真正踏上这条充满魅力与挑战的道路之前,我们需要在思维、心态、知识和工具上做哪些准备,才能让这段旅程走得更稳、更远、更具成长性。 一、思维重构:像工程师一样思考 学习前端的第一步,不是下载编辑器,而是启动大脑的“编程思维”模式。这是一种将现实世界的复杂问题,转化为计算机能够理解和执行的逻辑化、结构化思考方式。 抽象能力:从具象到通用 当你面对一个精美的网页时,编程思维会让你下意识地拆解它:这个导航栏可以抽象成一个包含 Logo 和菜单项的组件;这个商品卡片,可以提炼为一个可复用的模板,由图片、标题、价格三个数据槽位构成。

By Ne0inhk