是一个vue官方出品的 管理组件切换 的 插件
前端路由 (hash路由)
在同一个html页面, 显示不同的内容(组件). 进而建立了URL和组件之间的对应关系
在同一个页面, 借助锚链接
实现同一页面的不同部分的跳转
第一章: http://localhost:5500/index.html#chap1
第二章: http://localhost:5500/index.html#chap2
像#chap1
, #chap2
...这样的锚链接, 也叫做hash路由
也称为前端路由
后端路由
提供接口(数据)服务, 将不同请求方式+url, 映射到处理函数. 建立了URL和处理函数之间的对应关系
Vue三步
改造html
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
- <title>Documenttitle>
-
-
-
-
- <script src="https://unpkg.com/vue@2">script>
- <script src="https://unpkg.com/vue-router@3">script>
- head>
- <body>
-
- <div id="app">
-
-
-
-
- <router-link to="home" tag="div">首页router-link>
- <router-link to="about">相关router-link>
- <router-view>router-view>
- div>
-
- <script>
- //定义组件对象
- const Home = {
- template: 'home子组件',
- }
- const About = {
- template: 'about子组件',
- }
-
- //3.2 创建路由规则(url -> 组件对应关系)
- const routes = [
- { path: '/home', component: Home },
- { path: '/about', component: About },
- ]
-
- //3.3 创建VueRouter实例(路由器)
- const router = new VueRouter({
- routes: routes,
- })
-
- // 3.4 将路由对象挂载到根实例
- const vm = new Vue({
- el: '#app',
- router: router
- })
- script>
- body>
- html>
安装
npm i vue-router@3
vue2 安装 vue-router3.x
vue3 安装 vue-router4.x
VueRouter
- //最核心的内容,导出VueRouter对象
- import Vue from 'vue'
- //1. 导入VueRouter
- import VueRouter from 'vue-router'
-
- import Home from '../views/Home'
- import About from '../views/About'
-
- // debugger //在代码中打断点
- //安装插件(注册router-view,router-link组件,在 Vue上挂载 $router, $route)
- Vue.use(VueRouter)
- //2. 创建路由规则
- // 页面级组件(大)放到views,公共组件、小组件放到components
- const routes = [
- { path: '/home', component: Home },
- { path: '/about', component: About },
- ]
-
- //3. 创建VueRouter的实例
- const router = new VueRouter({
- routes,
- })
-
- //4. 导出router实例
- export default router
Vue.use(VueRouter)安装插件,在vue-router的install方法中进行:
在Vue上注册router-view、router-link组件
在Vue原型对象上挂载了$router $route
在代码中打断点:debugger
- <template>
- <div id="app">
-
- <router-view>router-view>
- div>
- template>
- // 导入路由对象
- import router from './router'
-
- new Vue({
- // 挂载
- router,
- render: (h) => h(App),
- }).$mount('#app')
使用@Vue/cli
工具创建项目时, 构建项目时直接选择router
#/about
hash模式/about
history模式(需要?支持)- const routes = [
- //设置一级路由
- //login-登录页
- { path: '/login', component: () => import('@/views/Login') },
- //home-后台首页
- {
- path: '/home',
- component: () => import('@/views/Home'),
- //优化三、设置默认重定向
- redirect: '/home/article',
- children: [
- // 不写/,会跟base路由拼接,最终效果/home/article
- { path: 'about', component: () => import('@/views/About') },
- { path: 'user', component: () => import('@/views/User') },
- // webpack分包机制/ 路由懒加载,常用,异步路由加载
- { path: 'Article', component: () => import('@/views/Article') },
- // 优化一: 提供空的子路由,覆盖路由不匹配的情况
- { path: '', component: () => import('@/views/Article') },
- ],
- },
- // 优化二: 默认路由,*要写在最下面
- { path: '*', component: () => import('@/views/NotFound') },
- ]
- <template>
- <div id="app">
- <a href="#/todo">Todo组件a>
- <a href="#/article">Article组件a>
- <div class="page">
- <router-view>router-view>
- div>
- div>
- template>
-
- <script>
- export default {
- name: 'App',
- }
- script>
$router
表示路由对象
路由规则对象
路由规则对象
(push, replace, go)路由对象上的routes
数组, 构成了路由规则$route
参数
query
$route.path 对应 router/index.js
中定义的路由规则
获取到user的id //localhost:8080/user?id=3 3
- <template>
- <div>
- {{ $route.params.id }}
- div>
- template>
- methods: {
- handleClick() {
- this.$router.params.id
- },
- },
a
元素tag
属性, 渲染为任意元素- <router-link to="/todo" tag="li">
- 显示Todo组件router-link>
- <router-link to="/article">
- 显示Article组件router-link>
-
- <li>显示Todo组件li>
- <a href="#/article">显示Article组件a>
一级路由出口
- <template>
- <div id="app">
-
-
-
-
- <router-view />
- div>
- template>
二级路由出口
- <template>
- <div class="home-container">
- <aside>
- <ul>
- <router-link to="/home/user" tag="li">用户router-link>
- <router-link to="/home/article" tag="li">文章router-link>
- ul>
- aside>
- <main>
- <header>header>
-
- <router-view>router-view>
- main>
- div>
- template>
导航
router----编程式导航
vue-router
两种方法
router-link
实现导航$router
路由器的方法, 以js代码的方式进行导航前进
后退
按钮进行操作- <button @click="handleClick">
- 导航到Todo组件
- button>
- methods: {
- handleClick() {
- // 导航到/todo组件
- console.log(this.$route) // 保存当前的URL
- if (this.$route.path != '/todo') {
- this.$router.push('/todo')
- }
- },
- },
/login
/article
/user
分析:
vue create admin-demo
选择 Babel 与Router
- const routes = [
- //设置一级路由
- //login-登录页
- { path: '/login', component: () => import('@/views/Login') },
- //home-后台首页
- {
- path: '/home',
- component: () => import('@/views/Home'),
- //优化三、设置默认重定向
- redirect: '/home/article',
- children: [
- // 嵌套路由不要写 /,否则会匹配到根路由base路由,写/是 /about, 不写是 /home/about
- { path: 'about', component: () => import('@/views/About') },
- { path: 'user', component: () => import('@/views/User') },
- // webpack分包机制/ 路由懒加载,常用,异步路由加载
- { path: 'Article', component: () => import('@/views/Article') },
- // 优化一: 提供空的子路由,覆盖路由不匹配的情况
- { path: '', component: () => import('@/views/Article') },
- ],
- },
- // 优化二: 默认路由,*要写在最下面
- { path: '*', component: () => import('@/views/NotFound') },
- ]
一级路由出口
- <template>
- <div id="app">
-
-
-
-
- <router-view />
- div>
- template>
二级路由出口
- <template>
- <div class="home-container">
- <aside>
- <ul>
- <router-link to="/home/user" tag="li">用户router-link>
- <router-link to="/home/article" tag="li">文章router-link>
- ul>
- aside>
- <main>
- <header>header>
-
- <router-view>router-view>
- main>
- div>
- template>
-
- <script>
- export default {
- name: 'Home',
- }
- script>
1:默认路由,* 要写在最下面
2:默认重定向
当访问后台首页时, 默认显示某一种信息(通常, 指定一个二级路由)
3:webpack分包机制/ 路由懒加载,常用,异步路由加载
编程式的导航
进行页面跳转(组件的切换)动态路由参数
(或localStorage) 进行兄弟组件间的带参跳转使用router-link渲染li元素, 使其具体点击切换功能
- <template>
- <div class="admin-container">
- <aside>
- <ul>
- <router-link to="/user" tag="li">用户管理router-link>
- <router-link to="/article" tag="li">文章管理router-link>
- ul>
- aside>
- <main>
- <header>header>
-
- <router-view>router-view>
- main>
- div>
- template>
作用:
校验权限
守护组件
扩展:
jwt,用token来解析身份信息,控制登录
- //设置全局前置导航守卫(url切换时执行)
- router.beforeEach((to, from, next) => {
- // to:到哪个个path去, from: 从哪个path来
- let isLogin = localStorage.getItem('isLogin')
-
- // 只要用户处于登录状态,直接进入到home首页
- // 如果访问的是'/login',直接进入/home页
- // 如果访问的不是'/login',直接调用next() 放行
- if (isLogin) {
- if (to.path == '/login') {
- next('/home')
- } else {
- next()
- }
- } else {
- if (to.path == '/login') {
- next()
- } else {
- // elementUI提供消息提示框
- // $message挂在Vue的原型对象上。Vue的实例可以直接访问,但Vue需要通过prototype访问
- // Message.error('请先登录')
- Vue.prototype.$message({
- message: '请先登录',
- type: 'warning',
- showClose: true,
- duration: 1000,
- })
- // alert('请先登录')
- next('/login')
- }
- }
- })
- export default router