「网页开发|前端开发|Vue」06 公共组件与嵌套路由:让每一个页面都平等地拥有导航栏

本文主要介绍在多个页面存在相同部分时,如何提取公共组件然后在多个页面中导入组件重复使用来减少重复代码。在这基础上介绍了通过嵌套路由的方式来避免页面较多或公共部分较多的情况下,避免不断手动导入公共组件的麻烦,并且加快页面跳转的速度。

文章目录

  • 本系列前文传送门
  • 一、场景说明
  • 二、公共组件
    • 提取公共组件
  • 三、嵌套路由

本系列前文传送门

  • 「网页开发|前端开发|Vue」01 快速入门:快速写一个Vue的HelloWorld项目
  • 「网页开发|前端开发|Vue」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转
  • 「网页开发|前端开发|页面布局」03 学会够用的CSS,实现任意你想要的页面布局
  • 「网页开发|前端开发|Vue」04 快速掌握开发网站需要的Vue基础知识
  • 「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

一、场景说明

在前面的文章中,我们已经介绍过如何编写多个页面,然后在上一篇文章中,我们为首页实现了一个导航栏。

现在考虑这样一个场景,我们有HomeAbout两个页面,为了用户在各个页面之间跳转方便,有良好的网页浏览体验,我们考虑在About页面也增加导航栏,如下:

/home                                 /about
+------------------+                  +-----------------+
| Header           |                  | Header          |
| +--------------+ |                  | +-------------+ |
| | Home         | |  +------------>  | | About       | |
| | Content      | |                  | | Content     | |
| +--------------+ |                  | +-------------+ |
+------------------+                  +-----------------+

二、公共组件

当我们需要在About页面中也增加一个相同的导航栏时,我们当然可以直接拷贝一份代码到About页面的代码中,但显然我们不会这么做。

在编程语言中,为了应对相同代码在多处使用的情况,会有函数、类、模块的设计,而在前端框架的设计中,会通过将公共部分或者说相同的代码部分,提取成独立的组件,然后在多处重复使用。

提取公共组件

我们将上次开发好的含导航栏的首页代码复制一份,然后命名为MyHeader.vue如下:

<template><div id="app"><div class="header"><div class="content-main"><div class="logo"><img src="../assets/logo.png" /><span>我的网站</span></div><ul class="nav-items"><li v-for="item in  routerList " :key="item.id"><el-link @click="$router.push({ path: item.path })" type="info">{{ item.name }}</el-link></li></ul><div class="user"><el-button size="mini">注册</el-button><el-button size="mini">登录</el-button></div></div></div></div>
</template><script>
export default {data() {return {routerList: [{path: "/",name: "首页",},{path: "/product",name: "产品",},{path: "/about",name: "关于我们",}]}}
}</script><style>
li {display: inline-block;margin: 20px;
}.nav-items {display: inline-block;
}.logo {display: inline-block;cursor: pointer;margin-right: 46px;/* >img 表示 class='logo'的元素中的<img>标签 */>img {width: 20px;height: 20px;vertical-align: middle;margin-right: 10px;}>span {font-weight: bold;vertical-align: middle;}
}.user {display: inline-block;margin-left: 46px;}
</style>

然后在原本的首页代码HelloWorld.vue中将导航栏代码作为组件导入,代码改动如下:
在这里插入图片描述

由于我们还没有删除原本存在的导航栏代码,所以现在如果成功导入一个新的导航栏后,首页应该要有两个导航栏,我们到浏览器验证这一点,如下:
在这里插入图片描述

并且确认两个导航栏的跳转功能都符合预期,然后我们就可以将首页代码HelloWorld.vue中的导航栏代码删除,然后在About代码中,重复我们刚才导入导航栏组件的操作,About.vue代码如下:

<template><div id="app"><MyHeader></MyHeader><h1>This is a About page</h1></div>
</template><script>
import MyHeader from './MyHeader.vue';
export default {components: { MyHeader },
}</script>

我们回到浏览器中,就可以看到首页和About页面显示如下,两个页面之间可以非常快速地跳转:
在这里插入图片描述
在这里插入图片描述

三、嵌套路由

我们刚才的做法,是直接把导航栏作为一个公共组件,然后在用到的页面中导入使用。但如果随着我们的项目规模变大,网站页面增多,我们如果每写一个页面都需要导入一次导航栏组件,就有点重复代码的味道了。

为此,我们可以使用嵌套路由来解决,我们再次看到两个页面的组成如下:

/home                                 /about
+------------------+                  +-----------------+
| Header           |                  | Header          |
| +--------------+ |                  | +-------------+ |
| | Home         | |  +------------>  | | About       | |
| | Content      | |                  | | Content     | |
| +--------------+ |                  | +-------------+ |
+------------------+                  +-----------------+

嵌套路由的用法就是:

  • 在两个具体路径的共同路径对应的页面代码中放入公共部分代码
  • 然后使用<router-view>代表不同的部分
  • 最后将不同的部分作为vue-router实例Routerchildren参数传入,由vue-router渲染不同的部分来替换<router-view>

比如这里的/home/about的公共路径就是/,公共代码是导航栏部分代码,所以应该在路径/对应的代码中放入导航栏组件代码,然后用<router-view>代表HomeAbout两个页面中各自独有的部分。

因为现在路径/直接对应的是HelloWorle.vue,导航栏代码和首页代码暂时耦合在一起,所以我们需要先把原本的HelloWolrd.vueAbout.vue拆成三个代码文件:Layout.vue, HellWorld.vueAbout.vue,三个文件代码如下:

  • HellWorld.vue
<template><div id="app"><h1>This is a Home page</h1></div>
</template>
  • About.vue
<template><div id="app"><h1>This is a About page</h1></div>
</template>
  • Layout.vue
<template><div id="app"><MyHeader></MyHeader><router-view></router-view></div>
</template><script>
import MyHeader from './MyHeader.vue';
export default {components: { MyHeader },
}
</script>

之后在渲染首页的时候,vue-router就会将<router-view>替换成HelloWorld.vue的内容;在渲染About页面的时候,vue-router就会将<router-view>替换成About.vue的内容。

但是我们需要跳转vue-router实例化时传入的routes参数才能实现这个效果。
于是我们回到src/router/index.js进行如下代码调整:
在这里插入图片描述

回到浏览器,我们可以看到页面已经如我们预期的那样,在两个页面中都展示导航栏了,如下:
在这里插入图片描述
在这里插入图片描述

之后如果我们再添加新的页面,比如添加一个产品页面Product来对应路径/product,这个改动只需要增加一个Product.vue,然后在src/router/index.js中增加一个路径对应关系,如下:

  • Product.vue
<template><div id="app"><h1>This is a Product page</h1></div>
</template>
  • src/router/index.js代码改动:
    在这里插入图片描述

回到我们的浏览器,尝试点击导航栏的「产品」就可以跳转到路径/product对应的Product页面,页面内容如下:
在这里插入图片描述
可以看到我们不需要在product.vue中添加导航栏的代码就可以让页面平等地拥有相同的导航栏,这就是嵌套路由的好处。当我们的页面相同部分的内容比较多,提取的公共组件也比较多,这种不需要将各个公共组件依次手动导入的做法,优势就会更加明显

甚至我们会发现,现在点击导航栏在各个页面之间跳转的速度极快,浏览器不需要重新加载页面资源就可以实现页面切换,这就是我们之前提到的vue-routerrouter-viewrouter-link进行跳转的好处。(●ˇ∀ˇ●)

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux监测进程打开文件

分析问题过程中&#xff0c;追踪进程打开的文件可以在许多不同情况下有用&#xff0c;体现在以下几个方面&#xff1a; 故障排除和调试&#xff1a; 当程序出现问题、崩溃或异常行为时&#xff0c;追踪进程打开的文件可以帮助找出问题的根本原因。这有助于快速定位错误&#x…

基于3D扫描和3D打印的产品逆向工程实战【数字仪表】

逆向工程是一种从物理零件创建数字设计的强大方法&#xff0c;并且可以与 3D 扫描和 3D 打印等技术一起成为原型设计工具包中的宝贵工具。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 3D 扫描仪可以非常快速地测量复杂的物体&#xff0c;并且在涉及现实生活参考时可以…

Scrapy简介-快速开始-项目实战-注意事项-踩坑之路

scrapy项目模板地址&#xff1a;https://github.com/w-x-x-w/Spider-Project Scrapy简介 Scrapy是什么&#xff1f; Scrapy是一个健壮的爬虫框架&#xff0c;可以从网站中提取需要的数据。是一个快速、简单、并且可扩展的方法。Scrapy使用了异步网络框架来处理网络通讯&…

下载配置 maven并在 idea 上应用

目录 一 maven 定义 二 Maven特点 三 Maven仓库 四 安装配置maven 步骤一:准备安装包,解压 步骤二:配置maven的环境变量 步骤三:测试maven的环境变量是否配置成功 步骤四:配置maven本地仓库 步骤五:阿里云、腾讯镜像配置 步骤六:全局配置idea的maven路径 步骤七:创建…

为IT服务台构建自定义Zia操作

Zia是manageengine的商业人工智能助手&#xff0c;是ServiceDesk Plus Cloud的虚拟会话支持代理。使用Zia&#xff0c;您可以优化帮助台管理&#xff0c;还可以缩小最终用户与其帮助台之间的差距&#xff0c;Zia通过执行预配置的操作来帮助用户完成他们的服务台任务。 例如&…

基于HBuilder X平台下的 驾校报名考试管理系统 uniapp 微信小程序3n9o5

本课题研究的是基于HBuilder X系统平台下的驾校管理系统&#xff0c;开发这款驾校管理系统主要是为了帮助学员可以不用约束时间与地点进行查看教练信息、考场信息等内容。本文详细讲述了驾校管理系统的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用、界面的布局和…

Helm Deploy Online Rancher Demo

文章目录 简介预备条件在线安装 Rancher Helm Chart选择 SSL 配置安装 cert-managerHelm 安装 Rancher验证 Rancher Server 是否部署成功 简介 Rancher 是一个开源的企业级全栈化容器部署及管理平台。已有超过 1900 万次下载&#xff0c;4000 生产环境的应用。 简单的说&…

PROSOFT PTQ-PDPMV1网络接口模块

通信接口&#xff1a;PROSOFT PTQ-PDPMV1 网络接口模块通常配备了多种通信接口&#xff0c;以便与不同类型的设备和网络进行通信。常见的接口包括以太网、串行端口&#xff08;如RS-232和RS-485&#xff09;、Profibus、DeviceNet 等。 协议支持&#xff1a;该模块通常支持多种…

基于单片机的八路抢答器(数码管版)(独立按键、四位共阳极数码管、指示灯)

随着科学技术的发展和普及&#xff0c;各种各样的竞赛越来越多&#xff0c;其中抢答器的作用也就显而易见。目前很多抢答器基本上采用小规模数字集成电路设计&#xff0c;使用起来不够理想。因此设计一更易于使用和区分度高的抢答器成了非常迫切的任务。现在单片机已进入各个领…

Sui上低Gas费为预言机注入强大动力

在当今世界中&#xff0c;大数据推动了许多真正有用的应用发展&#xff0c;预言机是将这些数据引入区块链的手段。然而&#xff0c;通过预言机进行数据调用需要在区块链上进行交易&#xff0c;并支付相关gas费。Sui保持稳定且低廉gas费的能力&#xff0c;使其成为依赖预言机app…

什么是ETLT?他是新一代数据集成平台?

什么是ETLT&#xff1f; 在现代数据处理和分析的时代&#xff0c;数据集成是一个至关重要的环节。数据集成涉及将来自各种来源的数据合并、清洗、转换&#xff0c;并将其加载到数据仓库或分析平台以供进一步的处理和分析。传统上&#xff0c;数据集成有两种主要方法&#xff0…

13 mysql date/time/datetime/year 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 datetime/date/time/year 类类型…

对线程池设置做压测

线程池代码 Configuration public class ThreadPoolConfig {// 核心线程池大小private int corePoolSize 24;// 最大可创建的线程数private int maxPoolSize 25;// 队列最大长度private int queueCapacity 100;// 线程池维护线程所允许的空闲时间private int keepAliveSeco…

VMware虚拟机安装CentOS6.9设置静态ip

1.设置虚拟网络编辑器 点击编辑–>虚拟网络编辑器 2.更改系统网络适配器选项 这里的子网掩码与网关&#xff0c;与第一步的一致 3.修改虚拟机主机名 vi /etc/sysconfig/networkNETWORKINGyue HOSTNAMEchen4.配置IP映射 vi /etc/hosts192.168.121.138 chen5.配置网卡…

使用 WebGL 为 HTML5 游戏创建逼真的地形

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 建 模 和 3D 地形 大多数 3D 对象是 使用建模工具创建&#xff0c;这是有充分理由的。创建复杂对象 &#xff08;如飞机甚至建筑物&#xff09;很难在代码中完成。建模工具 几乎总是有意义的&#xff0c;但也有例外&am…

ant-table组件表格数据做合计行,并固定在表格底部

需求描述 某些时候&#xff0c;我们表格展示数值型数据的时候&#xff0c;可能会想做一个合计处理&#xff0c;这样能直观的了解到当前列的总计数据信息。 遍观Table组件&#xff0c;官方是没有提供这个功能的&#xff0c;这就需要我们自己处理了 需求分析 根据表格的特性&a…

Java环境的安装

最近博主也是在学校开始学习了Java&#xff0c;也通过老师知道了可以通过大学生学生证申(bai)请(piao) IDEA的企业版&#xff08;社区版也是够学习用的&#xff09;有很多同学还是没有搞懂便做一下分享。 &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作…

算法笔记——路径问题

在引入介绍如何写一个算法的时候&#xff0c;我们先引入一个题作为例子 1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 作为刚开始学习算法的我们&#xff0c;看到这个题目的时候&#xff0c;应该想好以下的问题&#xff1a; 1.状态表示 我们要用什么来表…

MFC新建内部消息

提示&#xff1a;记录一下MFC新建内部消息的成功过程 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 先说一下基本情况&#xff0c;因为要在mapview上增加一个显示加载时间的功能。然后发现是要等加载完再显示时间&#xff0c;显示在主…

整理mongodb文档:分页

个人博客 整理mongodb文档:分页 个人博客&#xff0c;求关注&#xff0c;如果文章不够清晰&#xff0c;麻烦指出。 文章概叙 本文主要讲下在聚合以及crud的find方法中如何使用limit还有skip进行排序。 分页的情况很经常出现&#xff0c;这也是这篇博客诞生的理由。 数据准备…