vue-router路由配置

news2024/12/30 2:45:22

介绍:路由配置主要是用来确定网站访问路径对应哪个文件代码显示的,这里主要描述路由的配置、子路由、动态路由(运行中添加删除路由)

1、npm添加

npm install vue-router
// 执行完后会自动在package.json中添加
"vue-router": "^4.0.15"
// 如果区分dev或发布版本中使用,把上面添加的拷贝过去即可

2、在main.js中添加使用(主要是下面第3/13行)

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import router from '../router'
import 'element-plus/dist/index.css'
import './index.css'                    // 这个居中对齐了,不知道有哪些功能
import App from './App.vue'

const app = createApp(App)
// app.use(ElementPlus)
// app.mount('#app')
app
    .use(ElementPlus)
    .use(router)
    .mount('#app')

3、上面import的router需要在根目录下创建router文件夹,里面添加index.js文件

import {createRouter, createWebHashHistory} from "vue-router";
// import Home from "../views/test.vue";

const routes = [
    {
        path: '*',          // 默认在Home页面,没有匹配到路由时使用
        redirect: '/Home'
    }, {
        path: '/',
        redirect: '/test'
    }, {
        path: '/test',
        name: 'test',
        // 上面importvue文件名后在''中添加名字即可,或按需引入
        component: () => import('../views/test.vue')
    }
]

const router = createRouter({
    // createWebHashHistory路径有#号,createWebHistory路径不包含#。使用web方式部署到服务器刷新会报404错误
    history: createWebHashHistory(),
    routes
});

// router.beforeEach((to, from, next) => {
//     document.title = `${to.meta.title} | vue-manage-system`;
//     const role = localStorage.getItem('ms_username');
//     if (!role && to.path !== '/login') {
//         next('/login');
//     } else if (to.meta.permission) {
//         // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
//         role === 'admin'
//             ? next()
//             : next('/403');
//     } else {
//         next();
//     }
// });
export default router

4、在App.vue中添加显示

// router-view显示内容
<template>
  <div id="app" >
    <router-view/>
  </div>
</template>

5、router-link路由链接,跳转到指定位置

<!-- 字符串 -->
<router-link to="/home">Home</router-link>
<!-- 渲染结果 -->
<a href="/home">Home</a>

<!-- 使用 v-bind 的 JS 表达式 -->
<router-link :to="'/home'">Home</router-link>

<!-- 同上 -->
<router-link :to="{ path: '/home' }">Home</router-link>

<!-- 命名的路由 -->
<router-link :to="{ name: 'user', params: { userId: '123' }}">User</router-link>

<!-- 带查询参数,下面的结果为 `/register?plan=private` -->
<router-link :to="{ path: '/register', query: { plan: 'private' }}">
  Register
</router-link>

6、如何根据router切换子窗体?嵌套路由,示例代码:

 路由下加变量访问

const User = {
  template: '<div>User {{ $route.params.id }}</div>',
}

// 这些都会传递给 `createRouter`
const routes = [{ path: '/user/:id', component: User }]

子路由(router-view显示的内容中还有router-view),如下需要配置默认打开的子路由及显示对应子路由

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

7、同级目录下有多个显示

  <ul>
    <li>
      <router-link to="/">First page</router-link>
    </li>
    <li>
      <router-link to="/other">Second page</router-link>
    </li>
  </ul>
  <router-view class="view one"></router-view>
  <router-view class="view two" name="a"></router-view>
  <router-view class="view three" name="b"></router-view>

路由配置如下

import { createRouter, createWebHistory } from 'vue-router'
import First from './views/First.vue'
import Second from './views/Second.vue'
import Third from './views/Third.vue'

export const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      // a single route can define multiple named components
      // which will be rendered into <router-view>s with corresponding names.
      components: {
        default: First,
        a: Second,
        b: Third,
      },
    },
    {
      path: '/other',
      components: {
        default: Third,
        a: Second,
        b: First,
      },
    },
  ],
})

不用路由,vue加载显示

<template>
  <div>
    <Header/>
  </div>
</template>

<script>
import { useRouter } from "vue-router";
import Header from "../src/components/Header.vue";
import vTags from "../src/components/Tags.vue";
export default {
  components: {
    Header,
    vTags,
  },
}
</script>

嵌套路由时

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
import { useRouter } from "vue-router";
export default {
  methods:{
    clickMenu(item) {
      console.log(item);
      // console.log(item.name);
      this.$router.push({
        item
        // name: 'About'
      })
    }
  },
</script>

别人的教程代码,主要是看注释

import { createRouter } from'@naturefw/ui-elp'

import home from'../views/home.vue'

const router = {
  /**   * 基础路径   */
  baseUrl: baseUrl,

  /**   * 首页   */
  home: home,

  menus: [
    {
      menuId: '1', // 相当于路由的 name
      title: '全局状态', // 浏览器的标题
      naviId: '0', // 导航ID
      path: 'global', // 相当于 路由 的path
      icon: FolderOpened, // 菜单里的图标
      childrens: [ // 子菜单,不是子路由。
        {
          menuId: '1010', // 相当于路由的 name
          title: '纯state',
          path: 'state',
          icon: Document,
          // 加载的组件
          component: () =>import('../views/state-global/10-state.vue')
          // 还可以有子菜单。
        },
        {
          menuId: '1020',
          title: '一般的状态',
          path: 'standard',
          icon: Document,
          component: () =>import('../views/state-global/20-standard.vue')
        } 
      ]
    },
    {
      menuId: '2000',
      title: '局部状态',
      naviId: '0',
      path: 'loacl',
      icon: FolderOpened,
      childrens: [
        {
          menuId: '2010',
          title: '父子组件',
          path: 'parent-son',
          icon: Document,
          component: () =>import('../views/state-loacl/10-parent.vue')
        }
      ]
    } 
  ]
}

exportdefault createRouter(router )

8、push、replace函数

router.push(location)

使用 router.push 方法。这个方法会向 history 栈添加一个新记录,当用户点击浏览器后退按钮时,可以返回到之前的URL,所以,等同于

router.replace()导航后不会留下 history 记录。点击返回按钮时,不会返回到这个页面。

9、动态路由

动态路由主要通过两个函数实现。router.addRoute() 和 router.removeRoute()。它们只注册一个新的路由,也就是说,如果新增加的路由与当前位置相匹配,就需要你用 router.push() 或 router.replace() 来手动导航,才能显示该新路由。

之前在router文件夹下定义了router

const router = createRouter({
    // createWebHashHistory路径有#号,createWebHistory路径不包含#并且无法刷新显示(需要nginx适配)
    history: createWebHashHistory(),
    routes
});

添加路由,并手动调用 router.replace() 来改变当前的位置(覆盖我们原来的位置)

router.addRoute({ path: '/about', component: About })
// 我们也可以使用 this.$route 或 route = useRoute() (在 setup 中)
router.replace(router.currentRoute.value.fullPath)

如果你决定在导航守卫内部添加或删除路由,你不应该调用router.replace(),而是通过返回新的位置来触发重定向:

router.beforeEach(to => {
  if (!hasNecessaryRoute(to)) {
    router.addRoute(generateRoute(to))
    // 触发重定向
    return to.fullPath
  }
})

通过添加一个名称冲突的路由。如果添加与现有途径名称相同的途径,会先删除路由,再添加路由(以下三种删除方式):

// 这将会删除之前已经添加的路由,因为他们具有相同的名字且名字必须是唯一的
const removeRoute = router.addRoute(routeRecord)
// 删除路由如果存在的话
removeRoute()
// 删除路由
router.removeRoute('about')
// 添加路由
router.addRoute({ path: '/other', name: 'about', component: Other })

添加嵌套路由

router.addRoute({ name: 'admin', path: '/admin', component: Admin })
router.addRoute('admin', { path: 'settings', component: AdminSettings })

// 上面等效于如下实现方式
router.addRoute({
  name: 'admin',
  path: '/admin',
  component: Admin,
  children: [{ path: 'settings', component: AdminSettings }],
})

查看现有路由

Vue Router 提供了两个功能来查看现有的路由:

  • router.hasRoute():检查路由是否存在。
  • router.getRoutes():获取一个包含所有路由记录的数组。

10、动态路由用于登录

// 在login界面的事件中校验完成后,把用户名和密码存到本地,使用localStorage.getItem读取
localStorage.setItem("ms_username", param.username);
// 登录成功后触发访问其他页面
router.push("/");

在router中添加如下处理。beforeEach:添加一个导航守卫,在任何导航前执行。返回一个删除已注册守卫的函数

router.beforeEach((to, from, next) => {
    document.title = `${to.meta.title} | vue-manage-system`;
    const role = localStorage.getItem('ms_username');
    if (!role && to.path !== '/login') {
        next('/login');
    } else if (to.meta.permission) {
        // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
        role === 'admin'
            ? next()
            : next('/403');
    } else {
        next();
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某游戏辅助功能分析

FPS游戏发展至今&#xff0c;阻挡外挂开发者脚步的往往不是数据和功能开发&#xff0c;而是高难度的检测。 现如今&#xff0c;检测的手段越来越多&#xff0c;也越来越五花八门。列如&#xff1a; 检测参数&#xff0c;检测堆栈&#xff0c;检测注入等等。 CRC是众多检测手段中…

Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机

提示:本系列文章的索引目录在下面文章的链接里(点击下面可以跳转查看): Qt OpenGL 核心模式版本文章目录 Qt OpenGL(三十九)——Qt OpenGL 核心模式-在雷达坐标系中绘制飞行的飞机 一、场景 在之前绘制完毕雷达显示图之后,这时候,我们能匹配的场景就更广泛了,比如说…

string类模拟实现

了解过string常用接口后&#xff0c;接下来的任务就是模拟实现string类。 目录 VS下的string结构 默认成员函数和简单接口 string结构 c_str()、size()、capacity()、clear()、swap() 构造函数 拷贝构造函数 赋值重载 析构函数 访问及遍历 容量操作 reserve resize …

C语言(typedef,函数和指针)

目录 一.typedef 二.函数和指针 一.typedef typedef是一种高级数据特性&#xff0c;利用typedef可以为某一类型自定义名称。typedef创建的符号名只受限于类型 typedef unsigned char BYTE; BYTE x 这里的BYTE就相当于unsigned char x typedef unsigned char *BYTE; BYTE x,…

[oeasy]python0082_VT100_演化_颜色设置_VT选项_基础色_高亮色_索引色_RGB总结

更多颜色 回忆上次内容 上次 了解了控制序列 背后的故事 一切标准 都是 从无到有 的就连 负责标准的组织 也是 从无到有 的 VT-05 奠定了 基础颜色 黑底 绿字隔行 扫描 但 多颜色设置 是如何出现 的呢&#xff1f;&#xff1f;&#x1f914; 控制字符 1974年 产品 从VT05…

语音识别系列之脉冲神经网络特征工程

人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;中的单个人工神经元是对生物神经元的高度抽象、提炼和简化&#xff0c;模拟了后者的若干基本性质。得益于误差反向传播算法&#xff0c;网络权重可根据设定的目标函数得到有效地调整&#xff0c;ANN在视觉、…

LeetCode初级算法题(Java):反转链表+统计N以内的素数+删除排序数组中的重复项

文章目录1 反转链表1.1 题目1.2 解题思路解法1&#xff1a;迭代解法2&#xff1a;递归1.3 题解代码2 统计N以内的素数2.1 题目2.2 解题思路与题解代码解法1&#xff1a;暴力算法代码展示解法1&#xff1a;埃氏筛代码展示3 删除排序数组中的重复项3.1 题目3.2 解题思路3.3 题解代…

近红外染料标记小分子1628790-37-3,Cyanine5.5 alkyne,花青素CY5.5炔基

试剂基团反应特点&#xff1a;Cyanine5.5 alkyne用于点击化学标记的远红外/近红外染料炔烃。氰基5.5是Cy5.5的类似物&#xff0c;一种流行的荧光团&#xff0c;已广泛用于各种应用&#xff0c;包括完整生物体成像。在温和的铜催化化学条件下&#xff0c;该试剂可与叠氮基共轭&a…

构建RFID系统的重要组成部分

RFID读写设备&#xff0c;通常被用来扫描读取安装了RFID电子标签的目标物品&#xff0c;能实现快速批量无接触读写&#xff0c;是构建RFID系统的重要组成部分。RFID读写设备&#xff0c;通常有固定式读写设备和可移动读写设备两种。下面来了解一下RFID的特点&#xff0c;RFID系…

EZ-Cube简易款下载器烧写使用方法

一、硬件连接 跟目标芯片接4根线 VCC、GND、TOOL、REST 四根线&#xff0c;如果板子芯片自己外接电源的&#xff0c;VCC 线可以不接。 二、 安装烧写软件和驱动 烧写软件&#xff1a;https://download.csdn.net/download/Stark_/87444744?spm1001.2014.3001.5503 驱动程序&a…

java微信小程序的在线学习平台

本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对在线学习平台进行需求分析,得出在线学习平台主要功能。接着对在线学习平台进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程…

Apache JMeter 5.5 下载安装以及设置中文教程

Apache JMeter 5.5 下载安装以及设置中文教程JMeter下载Apache JMeter 5.5配置环境变量查看配置JDK配置JMeter环境变量运行JMeter配置中文版一次性永久设置正文JMeter 下载Apache JMeter 5.5 官方网站&#xff1a;Apache JMeter 官网 版本介绍&#xff1a; 版本中一个是Bina…

TCP协议 ---可靠传输的各种机制

目录 一、可靠 确认应答机制&#xff1a;保证数据可靠、有序的到达对端 超时重传机制 二、效率 2.1 提高自身发送数据量 滑动窗口机制&#xff1a; 滑动窗口的发送缓冲区是环形队列 滑动窗口的大小会变化吗&#xff1f; 滑动窗口的nb之处 滑动窗口丢包问题 2.2 对方…

锻炼管理器wger的安装

本文是 2021 年 2 月完成的&#xff0c;最近因为工作比较忙&#xff0c;就把这些老文章翻出来&#xff0c;但为了发表&#xff0c;老苏差不多又重写了一遍。 因为当时跑的是 wger/apache &#xff0c;现在新的 wger/apache 版本在老苏的机器上&#xff0c;会遇到 AH00141: Coul…

Windows Git Bash 配置

Windows Git Bash 配置 本文参考的文章&#xff1a; 在 Windows 的 Git Bash 中使用包管理器 - iris (ginshio.org)Git bash 安装 pacman & Windows 解压 zst 文件 | 伪斜杠青年 (lckiss.com) 一、Git的安装 Git 的安装应该是都会的&#xff0c;但还是应该说以下&#…

前端常见基础面试题css篇

目录 1.css3有哪些新特性&#xff1f; 2.CSS有哪些基本选择器&#xff1f;它们的权重是如何表示的&#xff1f; 3.css 选择器的类型优先级排序 4.写出几种CSS实现元素两个盒子垂直水平居中的代码 5.CSS 常见的伪类和伪元素有哪些? 6.CSS的引入方式有哪些&#xff1f;ink…

CMMI-外包与采购管理

外包与采购管理&#xff08;Outsourcing and Procurement Management, OPM&#xff09;是指外包管理和采购管理&#xff0c;目的是选择合适的承包商和供应商&#xff0c;并依据合同进行有效的管理。外包与采购管理过程域是SPP模型的重要组成部分。本规范阐述了外包与采购管理过…

自定义认证器

自定义认证器工作流程 1、设备向AWS IoT发送http请求&#xff0c;包含token和token签名 2、IoT判断这是一个自定义认证请求&#xff0c;然后确认token和token签名是否匹配 3、Lambda函数验证token之后&#xff0c;将输出5项数据&#xff0c; isAuthenticated&#xff1a;求是…

Zookeeper入门与应用

Zookeeper入门与应用1.简介1.1.应用场景1.2.Zookeeper的设计目标1.3数据模型2. 单机安装3.常用shell命令3.1.查询3.2.创建3.3.更新3.4.删除4.zookeeper的Acl权限控制案例/远程登录acl 超级管理员5.zookeeper的 JavaAPI连接到Zookeeper5.1.新增节点5.2.修改节点5.3.删除节点5.4.…

4、数组、切片、map、channel

目录一、数组二、切片三、map四、channel五、引用类型一、数组 数组&#xff1a; 数组是块连续的内存空间&#xff0c;在声明的时候必须指定长度&#xff0c;且长度不能改变所以数组在声明的时候就可以把内存空间分配好&#xff0c;并赋上默认值&#xff0c;即完成了初始化数组…