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

【VUE】vue-router

1. vue-router组件

1.1 路由的嵌套

index.js

import {createRouter, createWebHistory} from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/login',name: 'login',component: () => import('../views/LoginView.vue')},{path: '/info',name: 'info',component: () => import('../views/InfoView.vue')},{path: '/admin',name: 'admin',component: () => import('../views/AdminView.vue'),children: [{path: "",redirect: {name: "mine"}},{path: "mine",name: "mine",component: () => import('../views/MineView.vue')},{path: "order",name: "order",component: () => import('../views/OrderView.vue')}]}]
})
export default router

App.vue

<template><div class="page-header"><div class="container"><RouterLink to="/login">登录</RouterLink> |<RouterLink to="/info">信息</RouterLink> |<RouterLink to="/admin">后台</RouterLink> |<RouterLink to="/admin/mine">我的</RouterLink></div></div><div class="container"><RouterView/></div>
</template><script setup>
</script><style scoped>
.page-header {height: 48px;background-color: cornflowerblue;line-height: 48px;
}.container {width: 980px;margin: 0 auto;
</style>

AdminView.vue

<template><h1>Admin</h1><router-link to="/admin/mine">我的</router-link> |<router-link to="/admin/order">订单</router-link><RouterView/>
</template><script setup>
</script><style scoped>
</style>

1.2 编程式导航

不使用<router-link>标签实现路由的跳转。
使用js代码实现路由跳转,例如:
InfoView.vue

<template><h1>Info</h1>
</template><script setup>
import {useRouter} from "vue-router"const router = useRouter()
// router.push({path:"/admin/order"})
// router.push({name:"login"})
router.push({name: "login", params: {nid: 100}, query: {page: 100}})
</script><style scoped></style>

浏览器的后退前进缓存中,有以下区别:
push [A,B,C,D,新页面]
replace [A,B,C,新页面]

案例1:博客+公司官网+xx在线平台

  • 未登录,可以查看某些页面

  • 用户登录,去登录

  • 去查看某些页面

    现象:登录页是在有导航条的前提

App.vue

<template><div class="page-header"><div class="container"><RouterLink to="/info">信息</RouterLink>|<RouterLink to="/admin">后台</RouterLink>|<RouterLink to="/admin/mine">我的</RouterLink><div style="float:right;"><RouterLink to="/login">登录</RouterLink></div></div></div><div class="container"><RouterView/></div>
</template><script setup></script><style scoped>
body {margin: 0;
}.page-header {height: 48px;background-color: cornflowerblue;line-height: 48px;
}.page-header a {display: inline-block;padding: 0 10px;
}.container {width: 980px;margin: 0 auto;
}</style>

LoginView.vue

<template><div class="box"><p>用户名:<input type="text" placeholder="用户名" v-model="msg.username"></p><p>密码:<input type="text" placeholder="密码" v-model="msg.password"></p><p><button @click="doLogin">登录</button></p></div>
</template><script setup>
import {ref} from "vue";
import {useRouter} from "vue-router";const msg = ref({username: "",password: ""
})
const router = useRouter()const doLogin = function () {// 1、获取数据console.log(msg.value)// 2、发送网络请求// 3、跳转到首页router.push({name:"info"})
}</script><style scoped>
.box {width: 300px;margin: 100px auto;
}
</style>

案例2:后台管理

现象:登录页面,无导航条的前提。未登录时,不允许查看系统中有哪些菜单。
index.js

import {createRouter, createWebHistory} from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/login',name: 'login',component: () => import('../views/LoginView.vue')},{path: '/admin',name: 'admin',component: () => import('../views/AdminView.vue'),children: [{path: "",redirect: {name: "mine"}},{path: "mine",name: "mine",component: () => import('../views/MineView.vue')},{path: "order",name: "order",component: () => import('../views/OrderView.vue')}]}]
})export default router

App.vue

<template><div class="container"><RouterView/></div>
</template><script setup>
</script><style scoped>
body {margin: 0;
}
.container {width: 980px;margin: 0 auto;
}
</style>

LoginView.vue

<template><div class="box"><p>用户名:<input type="text" placeholder="用户名" v-model="msg.username"></p><p>密码:<input type="text" placeholder="密码" v-model="msg.password"></p><p><button @click="doLogin">登录</button></p></div>
</template><script setup>
import {ref} from "vue";
import {useRouter} from "vue-router";const msg = ref({username: "",password: ""
})
const router = useRouter()const doLogin = function () {// 1、获取数据console.log(msg.value)// 2、发送网络请求// 3、跳转到首页router.push({name:"mine"})
}
</script><style scoped>
.box {width: 300px;margin: 100px auto;
}
</style>

AdminView.vue

<template><div class="page-header"><div class="container"><RouterLink to="/admin/mine">我的</RouterLink>|<RouterLink to="/admin/order">订单</RouterLink></div></div><div class="container"><RouterView/></div>
</template><script setup>
</script><style scoped>
body {margin: 0;
}
.page-header {height: 48px;background-color: cornflowerblue;line-height: 48px;
}
.page-header a {display: inline-block;padding: 0 10px;
}
.container {width: 980px;margin: 0 auto;
}
</style>

1.3 导航守卫

请求之前,路由之前,进行拦截。
守护着每一个路由。

浏览器的本地存储

  • cookie:有效期+保存
  • localStorage:永久保存
  • sessionStorage:浏览器关闭后自动消失

index.js

import {createRouter, createWebHistory} from 'vue-router'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/login',name: 'login',component: () => import('../views/LoginView.vue')},{path: '/admin',name: 'admin',component: () => import('../views/AdminView.vue'),children: [{path: "",redirect: {name: "mine"}},{path: "mine",name: "mine",component: () => import('../views/MineView.vue')},{path: "order",name: "order",component: () => import('../views/OrderView.vue')}]}]
})
router.beforeEach(function (to,from,next) {// 1.访问登录页面,不需要登录就可以直接去查看if (to.name === "login") {next()return}// 2.检查用户登录状态,登录成功,继续往后走next();未登录,跳转至登录页面let username = localStorage.getItem("name")if (!username){next({name:"login"})return;}// 3.登录成功且获取到用户信息,继续向后访问next()
})
export default router

LoginView.vue

<template><div class="box"><p>用户名:<input type="text" placeholder="用户名" v-model="msg.username"></p><p>密码:<input type="text" placeholder="密码" v-model="msg.password"></p><p><button @click="doLogin">登录</button></p></div>
</template><script setup>
import {ref} from "vue";
import {useRouter} from "vue-router";const msg = ref({username: "",password: ""
})
const router = useRouter()const doLogin = function () {// 1、获取数据console.log(msg.value)// 2、发送网络请求// 3、本地存储用户信息(登录凭证)localStorage.setItem("name", msg.value.username)// 3、跳转到首页router.push({name:"mine"})
}</script><style scoped>
.box {width: 300px;margin: 100px auto;
}
</style>

AdminView.vue

<template><div class="page-header"><div class="container"><RouterLink to="/admin/mine">我的</RouterLink>|<RouterLink to="/admin/order">订单</RouterLink><div style="float:right;"><a @click="doLogout">退出</a></div></div></div><div class="container"><RouterView/></div>
</template><script setup>
import {useRouter} from "vue-router";const router = useRouter()
function doLogout() {localStorage.clear()router.push({name:"login"})
}
</script><style scoped>
body {margin: 0;
}.page-header {height: 48px;background-color: cornflowerblue;line-height: 48px;
}.page-header a {display: inline-block;padding: 0 10px;cursor: pointer;
}.container {width: 980px;margin: 0 auto;
}</style>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在虚幻引擎中实时显示帧率
  • 【计算机网络 - 基础问题】每日 3 题(二十)
  • nginx+keepalived健康检查案例详解(解决nginx出现故障却不能快速切换到备份服务器的问题)
  • 也遇到过 PIL Image “image file is truncated“的问题
  • 锤炼核心技能以应对编程革命
  • AndroidLogger插件使用技巧
  • JW01二氧化碳传感器(串行通信 STM32)
  • Linux:八种重定向详解(万字长文警告)
  • 低代码中实现数据映射的必要性与方案
  • 【计网】从零开始掌握序列化 --- 实现网络计算器项目
  • 细说硫酸钙防静电地板的材质结构和优势特点
  • 产品经理面试整理-常见面试问题
  • 开放原子开源基金会OPENATOM
  • 京准电钟:NTP网络校时服务器助力校园体育场馆
  • 论文 | Reframing Instructional Prompts to GPTk’s Language
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • django开发-定时任务的使用
  • node.js
  • node入门
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python爬虫--- 1.3 BS4库的解析器
  • vue-router 实现分析
  • 读懂package.json -- 依赖管理
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 类orAPI - 收藏集 - 掘金
  • 山寨一个 Promise
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 终端用户监控:真实用户监控还是模拟监控?
  • 从如何停掉 Promise 链说起
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Redis 入门到精通(一)数据类型(4)
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (21)起落架/可伸缩相机支架
  • (Git) gitignore基础使用
  • (ZT)出版业改革:该死的死,该生的生
  • (备份) esp32 GPIO
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (蓝桥杯每日一题)love
  • (力扣题库)跳跃游戏II(c++)
  • (十八)三元表达式和列表解析
  • (转)ABI是什么
  • (转)Windows2003安全设置/维护
  • (自用)网络编程
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net mvc 获取url中controller和action
  • .net 调用海康SDK以及常见的坑解释