从零开始搭建Vue3框架(二):Vue-Router4.0使用与配置

news2024/10/6 6:00:12

前言

上篇文章我们创建了模板项目并成功运行,但是运行后的页面只是一个静态页面,并没有页面间跳转。

对于Vue这种单页应用来说,最要紧的就是控制整个系统的页面路由。因为我们使用Vue3的框架,所以这里使用Vue-Router4.0版本。

安装

通过npm安装:

npm install vue-router@4

安装成功以后,可以看到最新的是4.2.4版本:

在这里插入图片描述

路由配置

创建路由

首先在我们工程/src目录下创建/route和/views目录,并创建/route/index.js 和 /views/main.vue 文件,目录结构如下图;

在这里插入图片描述

在 index.js 文件配置路由:

// 1.引入创建路由需要的组件
import { createRouter, createWebHistory } from 'vue-router'

// 2.配置系统所有路由页面,浏览器通过path路径加载对应组件
const routes = [
    { path: '/main', component: () => import('@/views/main.vue') }
]

// 3.创建路由实例
const router = createRouter({
    history: createWebHistory(), //使用history模式,hash模式使用 createWebHashHistory() 方法
    routes
})

// 4.声明,为路由提供外部引用的入口
export default router

这里注意新版本 vue-router 的方法必须单独引入,与老版本写法有些区别。这里用到了 createWebHistory 创建history模式路由,如果需要hash模式的话可以调用 createWebHashHistory 方法。

引入路由

路由的引入我们采用全局的方式,在main.js文件中引入:

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'

import router from '@/route/index' // 1.引入router

const app = createApp(App)

app.use(router)    // 2.引用router

app.mount('#app')

同时在app.vue和main.vue 分别修改组件代码:

app.vue

<script setup>

</script>

<template>
   <router-view></router-view>
</template>

<style scoped>

</style>

其中”router-view“ 将显示与 url 对应的组件。可以放在任何地方,以适应布局。

main.vue

<script setup>
</script>

<template>
    <div>这是 main</div>
</template>

<style scoped>
</style>

然后运行项目(npm run dev),打开指定的路由地址,得到我们想要的页面内容。

在这里插入图片描述

嵌套路由

上面的代码实现了路由页面的控制,但是现在的网站更多的是这个样子的:
在这里插入图片描述

要求在空白区域进行导航切换的,简单的路由配置是无法实现的。

这种情况就需要借助嵌套路由来实现了。

首先创建/views/user/userpage1.vue 和 /views/user/userpage2.vue

在这里插入图片描述在这里插入图片描述

然后修改main.vue的内容,左边是菜单,右边是显示的内容:

<script setup>
</script>

<template>
    <div class="container">
        <!-- 菜单 -->
        <div class="menu">
            <ul>
                <li><router-link to="/main/userpage1">userpage1</router-link></li>
                <li><router-link to="/main/userpage2">userpage2</router-link></li>
            </ul>
        </div>
        <!-- 内容 -->
        <div class="content">
            <router-view></router-view>
        </div>
    </div>
</template>

<style scoped>
.container {
    width: 100%;
    height: 100%;
    display: flex;
}

.menu {
    width: 200px;
    background: aliceblue;
}

.content {
    flex: 1;
}
</style>

并修改 /route/index.js 配置,通过children属性指定路由main的子路由userpage1和userpage2:

// 1.引入创建路由需要的组件
import { createRouter, createWebHistory } from 'vue-router'

// 2.配置系统所有路由页面
const routes = [
    {
        path: '/main',
        component: () => import('@/views/main.vue'),
        children: [
            {
                path:'/main/userpage1',
                component: () => import('@/views/user/userpage1.vue'),
            },
            {
                path:'/main/userpage2',
                component: () => import('@/views/user/userpage2.vue'),
            }
        ]
    }
]

// 3.创建路由实例
const router = createRouter({
    history: createWebHistory(), //使用history模式,hash模式使用 createWebHashHistory() 方法
    routes
})

// 4.声明,为路由提供外部引用的入口
export default router

重新运行项目以后,页面显示如下:

在这里插入图片描述
这时候点击左侧导航,会发现浏览器地址发生改变了,但是页面只重绘了空白区域的内容,加载出了对应组件的内容。
在这里插入图片描述
在这里插入图片描述

这样就实现了我们上面提到的,由菜单导航控制内容区域的路由逻辑。

动态路由

上面讲到路由配置,只是在事先知道有哪些路由的情况下静态配置的。

但是,在实际项目中很多情况下会根据用户的权限,控制用户能够访问的页面。

这个时候虽然静态配置也是可以的(通过菜单有无控制),但是会一次性加载很多路由资源,这种情况下使用动态路由是最优秀的解决方案。

首先修改main.vue的内容,增加两个路由菜单userpage3和userpage4:

<script setup>
</script>

<template>
    <div class="container">
        <!-- 菜单 -->
        <div class="menu">
            <ul>
                <li><router-link to="/main/userpage1">userpage1</router-link></li>
                <li><router-link to="/main/userpage2">userpage2</router-link></li>
                <li><router-link to="/main/userpage3">userpage3</router-link></li> // 动态路由
                <li><router-link to="/main/userpage4">userpage4</router-link></li> // 动态路由
            </ul>
        </div>
        <!-- 内容 -->
        <div class="content">
            <router-view></router-view>
        </div>
    </div>
</template>

<style scoped>
.container {
    width: 100%;
    height: 100%;
    display: flex;
}

.menu {
    width: 200px;
    background: aliceblue;
}

.content {
    flex: 1;
}
</style>

然后在views目录下创建userpage3.vue和userpage4.vue:

在这里插入图片描述
在这里插入图片描述

页面创建好了以后,下一步就是配置路由了。此时我们不再route/index下面配置路由了,而是在main.js中添加两个动态路由:

import { createApp } from 'vue'
import App from './App.vue'

import router from '@/route/index'

const app = createApp(App)

app.use(router)

//添加动态路由
router.addRoute(
    'main',
    {
        path: '/main/userpage3',
        component: () => import('@/views/user/userpage3.vue')
    }
)
router.addRoute(
    'main',
    {
        path: '/main/userpage4',
        component: () => import('@/views/user/userpage4.vue')
    }
)

app.mount('#app')

addRoute 是官方提供动态添加路由的方法,由于我们要在/main路径下添加子路由,所以addRoute的第一个参数**“main”**我们指定了要添加到父路由的name,所以需要修改route/index.js :

// 1.引入创建路由需要的组件
import { createRouter, createWebHistory } from 'vue-router'

// 2.配置系统所有路由页面
const routes = [
    {
        path: '/main',
        name: 'main', // 指定父路由name,供动态路由使用
        component: () => import('@/views/main.vue'),
        children: [
            {
                path:'/main/userpage1',
                component: () => import('@/views/user/userpage1.vue'),
            },
            {
                path:'/main/userpage2',
                component: () => import('@/views/user/userpage2.vue'),
            }
        ]
    }
]

// 3.创建路由实例
const router = createRouter({
    history: createWebHistory(), //使用history模式,hash模式使用 createWebHashHistory() 方法
    routes
})

// 4.声明,为路由提供外部引用的入口
export default router

至此,运行项目我们就可以访问动态添加的路由了:

在这里插入图片描述

项目中的动态路由一般是根据权限,循环添加的,这里只是先做个演示。后面接入接口调用以后,会做个封装,标准化的完成路由添加。

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

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

相关文章

1992-2021年全国及31省对外开放度测算数据含原始数据和计算过程(无缺失)

1992-2021年全国及31省对外开放度测算数据含原始数据和计算过程&#xff08;无缺失&#xff09; 1、时间&#xff1a;1992-2021年 2、范围&#xff1a;全国及31省 3、指标&#xff1a;进出口总额、国内生产总值、年均汇率 4、计算方法&#xff1a;对外开放度进出口总额/GDP…

【Git系列】Git配置SSH免密登录

&#x1f433;Git配置SSH免密登录 &#x1f9ca;1.设置用户名和邮箱&#x1f9ca;2. 生成密钥&#x1f9ca;3.远程仓库配置密钥&#x1f9ca;2. 免密登录 在以上push操作过程中&#xff0c;我们第一次push时&#xff0c;是需要进行录入用户名和密码的&#xff0c;比较麻烦。而且…

【数据分析专栏之Python篇】四、pandas介绍

前言 在上一篇中我们安装和使用了Numpy。本期我们来学习使用 核心数据分析支持库 Pandas。 一、pandas概述 1.1 pandas 简介 Pandas 是 Python 的 核心数据分析支持库&#xff0c;提供了快速、灵活、明确的数据结构&#xff0c;旨在简单、直观地处理关系型、标记型数据。 …

Resnet与Pytorch花图像分类

1、介绍 1.1数据集介绍 flower_data├── train│ └── 1-102&#xff08;102个文件夹&#xff09;│ └── XXX.jpg&#xff08;每个文件夹含若干张图像&#xff09;├── valid│ └── 1-102&#xff08;102个文件夹&#xff09;└── ─── └── XXX.jp…

如何使用免费敏捷工具Leangoo领歌管理Sprint Backlog

什么是Sprint Backlog&#xff1f; Sprint Backlog是Scrum的主要工件之一。在Scrum中&#xff0c;团队按照迭代的方式工作&#xff0c;每个迭代称为一个Sprint。在Sprint开始之前&#xff0c;PO会准备好产品Backlog&#xff0c;准备好的产品Backlog应该是经过梳理、估算和优先…

ffmpeg安装

简介 FFmpeg是一个开源的音视频处理库&#xff0c;它提供了一系列的工具和API&#xff0c;可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作&#xff0c;比如转码、剪辑、合并等。FFmpeg的命令格式通常是&#xff1a;ffmpeg [全局选项] {[输入文…

章节5:SQL注入之WAF绕过

章节5&#xff1a;SQL注入之WAF绕过 5.1 SQL注入之WAF绕过上 WAF拦截原理&#xff1a;WAF从规则库中匹配敏感字符进行拦截。 5.2 SQL注入之WAF绕过下 &#xff08;原理简单了解&#xff09; 关键词大小写绕过 有的WAF因为规则设计的问题&#xff0c;只匹配纯大写或纯小写的…

B. Binary Cafe(二进制的妙用)

题目&#xff1a;Problem - B - Codeforces 总结&#xff1a; 对于该题最简单的方法为使用二进制的数表示状态 例如&#xff1a; 对于一个数7的二进制&#xff1a;111 它的每一位都可表示两种状态我们可以理解为取或者不取 对于7这个数字它可以表示一种状态即在三个位置都…

使用Roles模块搭建LNMP架构

使用Roles模块搭建LNMP架构 1.Ansible-playbook中部署Nginx角色2.Ansible-playbook中部署PHP角色3.Ansible-playbook中部署MySQL角色4.启动安装分布式LNMP 1.Ansible-playbook中部署Nginx角色 创建nginx角色所需要的工作目录&#xff1b; mkdir -p /etc/ansible/playbook/rol…

剖析 Kubernetes 控制器:Deployment、ReplicaSet 和 StatefulSet 的功能与应用场景

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【kubernetes】k8s单master集群环境搭建及kuboard部署

k8s入门学习环境搭建 学习于许大仙: https://www.yuque.com/fairy-era k8s官网 https://kubernetes.io/ kuboard官网 https://kuboard.cn/ 基于k8s 1.21.10版本 前置环境准备 一主两从&#xff0c;三台虚拟机 CPU内存硬盘角色主机名IPhostname操作系统4C16G50Gmasterk8s-mast…

JSON动态生成表格

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>var fromjava"{\"total\":3,\"students\":[{\"name\":\"张三\",\&q…

哔哩哔哩缓存转码|FFmpeg将m4s文件转为mp4|PHP自动批量转码B站视频

window下载安装FFmpeg 打开ffMpeg官网选择window>Windows builds from gyan.dev 打开https://www.gyan.dev/ffmpeg/builds/ 这里是上面提取的下载链接如果过期不能用自己去官网下 配置FFmpeg环境变量 上面下载的FFmpeg是绿色软件&#xff0c;下载解压到你的常用软件安装目…

配置IPv6 over IPv4 GRE隧道示例

组网需求 如图1&#xff0c;两个IPv6网络分别通过SwitchA和SwitchC与IPv4公网中的SwitchB连接&#xff0c;客户希望两个IPv6网络中的PC1和PC2实现互通。 其中PC1和PC2上分别指定SwitchA和SwitchC为自己的缺省网关。 图1 配置IPv6 over IPv4 GRE隧道组网图 配置思路 要实现I…

【LeetCode每日一题合集】2023.7.24-2023.7.30(TODO Lazy 线段树)

文章目录 771. 宝石与石头代码1——暴力代码2——位运算集合⭐&#xff08;英文字母的long集合表示&#xff09; 2208. 将数组和减半的最少操作次数&#xff08;贪心 优先队列&#xff09;2569. 更新数组后处理求和查询⭐⭐⭐⭐⭐&#xff08;线段树&#xff09;2500. 删除每行…

这所985很保护一志愿,每年招150+!非常稳定!

一、学校及专业介绍 中国海洋大学&#xff08;Ocean University of China&#xff0c;OUC&#xff09;&#xff0c;位于山东省青岛市&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;位列国家“双一流”、“985工程”、“211工程”重点建设高校。 1.1…

CHI中的error处理

Error Handling Error types 包含两种sub-packet级别的error, 和两种packe级别的error; Packet level error Data Error, DERR □ 访问的地址是正确的&#xff0c;但是访问的数据有错误&#xff1b;通常是在数据崩溃的时候使用&#xff0c;例如ECC&#xf…

三分钟白话RocketMQ系列—— 核心概念

目录 关键字摘要 Q1&#xff1a;RocketMQ是什么&#xff1f; Q2: 作为消息中间件&#xff0c;RocketMQ和kafka有什么区别&#xff1f; Q3: RocketMQ的基本架构是怎样的&#xff1f; Q4&#xff1a;RocketMQ有哪些核心概念&#xff1f; 总结 RocketMQ是一个开源的分布式消…

iOS--Runloop

Runloop概述 一般来说&#xff0c;一个线程一次只能执行一个任务&#xff0c;执行完成后线程就会退出。就比如之前学OC时使用的命令行程序&#xff0c;执行完程序就结束了。 而runloop目的就是使线程在执行完一次代码之后不会结束程序&#xff0c;而是使该线程处于一种休眠的状…

初步了解c#编程语言--(1)

初识c#编程语言 一、见识c#语言编写的各类应用程序 关于用c#语言编写的各类应用程序有以下几种&#xff1a; 1.Console 在编写Console程序时&#xff0c;要注意创建项目时&#xff0c;是选择控制台应用程序&#xff08;Console Application&#xff09;&#xff0c;在这里…