vue基础教程(7)——构建项目级首页

同学们可以私信我加入学习群!


正文开始

  • 前言
  • 一、页面结构
  • 二、侧边栏
  • 三、主体部分
  • 总结


前言

前面我们学习了vue的路由和登录页搭建,本文将和大家共同学习首页的搭建。

首页示例如图:
在这里插入图片描述
很多项目经验比较少的同学,一般都是对某些语法很熟悉,但是对整个项目是如何从零开始搭建的,页面布局是如何通过代码实现的,可能并未过多关注。

也许有人会说,这些ui框架或者开源项目,都会开箱即用,可如果框架提供的布局无法满足要求呢,如果开源项目存在bug呢,如果企业做大做强需要UI重新设计web端呢?

我们有太多的理由去了解这些基础知识,我们可以永远不做,但是不能不会!


一、页面结构

通过上图可以看出,首页大体分为三个部分:
1.左侧侧边栏

2.上侧面包屑、标签

3.右侧页面主体

如果每块代码都解析一遍,没有必要,文章也会显得又臭又长。本文主要还是想在前面router讲解的基础上,和大家一起学习一下,项目中侧边栏和右侧主体部分,是如何设计跳转逻辑的。

所以本文重点讲解侧边栏与右侧页面主体。

二、侧边栏

在博主项目,页面结构设计代码都在main.vue中,其中侧边栏基于viewui提供的Menu组件,右侧主体则主要在layout组件中。

代码结构如下:

 <Sider><side-menu>侧边栏,主要基于Menu实现</side-menu></Sider><Layout><Content>主体</Content>
</Layout>

可以看出,我们Sider部分的代码主要是一个自定义的side-menu组件,代码结构如图:
在这里插入图片描述
可以看出主要由三部分组成:

1.slot,用来通过父组件,放一些简单的元素,比如网站名,比如logo图片等,在最上面。

2.menu,主要代码,用来渲染左侧的菜单。

3.div,这部分是当左侧收起来后的代码。我们可以暂时不去关注。

menu部分组件代码:

     <Menuref="menu"v-show="!collapsed":active-name="activeName":open-names="openedNames":accordion="accordion":theme="theme"width="auto"@on-select="handleSelect"><template v-for="item in menuList"><template v-if="item.children && item.children.length === 1"><side-menu-itemv-if="showChildren(item)":key="`menu-${item.name}`":parent-item="item"></side-menu-item><menu-itemv-else:name="getNameOrHref(item, true)":key="`menu-${item.children[0].name}`"><common-icon :type="item.children[0].icon || ''" /><span>{{ showTitle(item.children[0]) }}</span></menu-item></template><template v-else><side-menu-itemv-if="showChildren(item)":key="`menu-${item.name}`":parent-item="item"></side-menu-item><menu-itemv-else:name="getNameOrHref(item)":key="`menu-${item.name}`"><common-icon :type="item.icon || ''" /><span>{{ showTitle(item) }}</span></menu-item></template></template></Menu>

这部分代码拆分出来后,就不难理解了,这里就是一个对menuList的循环渲染,menuList是通过我们的路由数组得到的。

循环时,判断元素是否有children对象,如果有,并且只有一个子元素,那么就不展开了,子元素的名称就是左侧侧边栏的名称。比如下图的联系我。
在这里插入图片描述
它的router结构如下:
在这里插入图片描述
因为qrCode这个节点有且只有一个子路由,那就是qrCode_contetn,所以根据上面那段代码的判断,它不再显示层级关系,直接显示【联系我】这个菜单。

把这个情况单独处理,是因为它的特殊性,它并不是显示的自身节点的信息,而是显示了唯一一个子路由的信息。其他的情况,不论是没有子路由的情况,还是多个子路由的情况,都是显示自身节点的信息。

通过上面的代码也能看出,这个判断影响的只是:

    <common-icon :type="item.icon || ''" /><span>{{ showTitle(item) }}</span></menu-item

而上面代码的核心组件是side-menu-item,也就是如何通过menuList中的每一个元素,渲染成对应的菜单:

<side-menu-item v-if="showChildren(item)" :key="`menu-${item.name}`" :parent-item="item"></side-menu-item>

这里有个判断,当路由节点有子路由时,才会渲染子路由组件,否则,直接显示路由的信息。

子路由,也就是side-menu-item组件代码如下:

       <Submenu :name="`${parentName}`"><template v-slot:title><common-icon :type="parentItem.icon || ''" /><span>{{ showTitle(parentItem) }}</span></template><template v-for="item in children"><template v-if="item.children && item.children.length === 1"><side-menu-itemv-if="showChildren(item)":key="`menu-${item.name}`":parent-item="item"></side-menu-item><menu-itemv-else:name="getNameOrHref(item, true)":key="`menu-${item.children[0].name}`"><common-icon :type="item.children[0].icon || ''" /><span>{{ showTitle(item.children[0]) }}</span></menu-item></template><template v-else><side-menu-itemv-if="showChildren(item)":key="`menu-${item.name}`":parent-item="item"></side-menu-item><menu-itemv-else:name="getNameOrHref(item)":key="`menu-${item.name}`"><common-icon :type="item.icon || ''" /><span>{{ showTitle(item) }}</span></menu-item></template></template></Submenu>

这个里面就是最后一步,处理子路由节点了。根据子路由节点配置的属性值,在这里判断后进行相应的操作,如果子路由还有子节点,那就递归调用side-menu-item组件,最终完成多层路由的渲染。

三、主体部分

主体部分相较于侧边栏,要简单很多。

主体用layout布局,包含上方的标签导航和下方的内容展示部分。

代码如下:

      <Content class="main-content-con"><Layout class="main-layout-con"><div class="tag-nav-wrapper"><tags-nav :value="$route" @input="handleClick" :list="tagNavList" @on-close="handleCloseTag"/></div><Content class="content-wrapper"><router-view v-slot="{Component}"><keep-alive :include="cacheList"><component :is="Component"></component></keep-alive></router-view><ABackTop :height="100" :bottom="80" :right="50" container=".content-wrapper"></ABackTop></Content></Layout></Content>

最终效果如图:
在这里插入图片描述
因为内容展示部分是用router-view实现,所以每次路由更改后,页面内容重新渲染的部分,只有这里的内容展示部分,页面其它部位都是固定元素渲染。

路由部分的代码简单讲解下,具体的知识点,如果有兴趣请参照官网理解,如果没兴趣,暂时不去理解,并不影响简单的项目开发。

router-view是插件router提供的用法,后面Component等属性,都是router提供的用法。

keep-alive是vue3提供的组件,这是在缓存组件,符合条件的路由节点,可以按照我们的规则进入缓存数组cacheList中,缓存的数组,每次切换页面,不会重新渲染,这在有些场景下十分有用。

比如,有两个经常互相切换的页面,都有一些筛选查询功能,如果切换后,填写的查询条件就被清空,那用户体验会很糟糕,所以这里留个可以缓存的规则,当用户不想在切换某些页面时,丢失页面数据,就可以把页面对应的路由扔进cacheList中。

component组件也是vue3提供的,这是在动态渲染组件。子路由的节点那么多,有些可能是通过权限动态获取的,我们不可能把每个路由对应的组件都通过import引入到这个页面中,然后去渲染。所以就需要动态渲染的逻辑,is属性对应的就是组件,把哪个组件赋值给is,component就会渲染成对应的组件。由此,实现在这一个位置,渲染所有组件的目的。

最终首页效果图如下:
在这里插入图片描述


总结

获取资源,查看代码示例,或者联系我:

https://lizetoolbox.top:8080/#/qrCode_contact

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

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

相关文章

浅谈操作系统中的重要概念——进程

文章目录 一、什么是程序&#xff1f;二、什么是进程&#xff1f;三、进程与程序有什么区别&#xff1f;四、OS是如何管理进程的4.1、使用 结构体 进行描述进程4.2 、使用数据结构组织众多进程4.3、PCB4.3.1、PCB 里有哪些属性4.3.1.1 pid4.3.1.2 内存指针4.3.1.3 文件描述符表…

2024年如何保存微信小程序里的音频文件#下载高手

今年是2024年&#xff0c;仍然有很多人不知道如何下载&#xff0c;本文就带你们学会如何下载微信小程序里面的音频素材 这里要用到一个工具&#xff0c;下载高手 下载高手链接&#xff1a;https://pan.baidu.com/s/1JUWmNXozWSS3xgmvpdyf0g?pwd1234 提取码&#xff1a;1234…

后端程序员利用 AI 给网站制作专业 favicon

看看你的 Chrome 浏览器顶部的标签页&#xff0c;每个标签页前面有一个小小的图标&#xff0c;这个就是 favicon&#xff0c;如果你将网页保存到收藏夹&#xff0c;前面也会是这个小图标。这个图标有时候就是网站的 Logo&#xff0c;有时候也不太一样。 上面截图中&#xff0c…

PHP7 +nginx Docker 部署

一、php docker 1、创建php Docker, Dockerfile文件如下 FROM php:7.3.7-fpmRUN mkdir -p /php/myphp 2、启动脚本start.sh&#xff0c;其中会安装php mysql驱动 #&#xff01;/bin/bash rm -rf myphp unzip myphp.zip cp .env.pro ./myphp cp .env ./myphpdocker rm -f m…

Apifox接口调试工具

1、Apifox简介 Apifox 是集 API 文档、API 调试、API Mock、API 自动化测试多项实用功能为一体的 API 管理平台&#xff0c;定位为 Postman Swagger Mock JMeter。旨在通过一套系统、一份数据&#xff0c;解决多个工具之间的数据同步问题。只需在 Apifox 中定义 API 文档&a…

leetcode-合并二叉树-90

题目要求 思路 1.如果两个结点都存在&#xff0c;就把对应的val加起来创建一个新的结点 2.如果有一个结点不存在&#xff0c;就用村在的那个结点 3.最后返回创建的头结点 代码实现 /*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* Tre…

【鸿蒙应用】理财App

目录 第一节项目讲解项目介绍 第二节&#xff1a;项目创建登录静态框架编写登录页面设稿新建项目控制台添加项目Login页面封装标题组件 第三节&#xff1a;登录页静态表单编写第四节—内容页架构分析底部栏组件第五节—底部栏组件切换第六节&#xff1a;首页静态页编写第七节&a…

第十、十一章、十二章 折线图 + 地图 + 柱状图的绘制

第十章 折线图的绘制 官网&#xff1a;pyecharts - A Python Echarts Plotting Library built with love. 画廊官网&#xff1a;Document 懒人工具&#xff1a;懒人工具-手机APP工具下载-手机软件下载大全 - 173软件站 (ab173.com) 导学 json 定义 &#xff08;1&#xff…

js的算法-交换排序(冒泡)

交换排序 所谓交换排序&#xff0c;是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多&#xff0c;本次介绍冒泡排序和快速排序。 冒泡 基本思想 从后往前&#xff08;或从前往后&#xff09;两两比较相邻元素的值&#xff0…

开启医疗数据新纪元:山海鲸可视化智慧医疗解决方案

在数字化浪潮席卷而来的今天&#xff0c;智慧医疗作为医疗行业的创新力量&#xff0c;正以其独特的技术优势&#xff0c;推动着医疗服务的升级和变革。而在这场变革中&#xff0c;山海鲸可视化以其出色的数据可视化能力&#xff0c;为智慧医疗提供了强大的技术支持&#xff0c;…

PMP®考试的形式、题型、考试内容和趋势

PMP考试形式&#xff1a; 国内的PMP考试是由中国国际人才交流基金会和PMI共同组织举办&#xff0c;统一采取的都是线下笔试。一年考4次&#xff0c;今年的考试安排在3月、6月、8月、11月。3月10日的PMP考试已结束&#xff0c;接下来是6月份的考试&#xff0c;考试时间预计在6月…

qt tcp 连接 秒断连

问题&#xff1a; tcp连接总是秒成功后断连 debug会出现下面这些 onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!00007FFDA2A1D93D: (caller: 00007FFDD8BEACF6) LogHr(1) tid(336c) 8007277C ¡£¡£ one…

一例MFC文件夹病毒的分析

概述 这是一个MFC写的文件夹病毒&#xff0c;通过感染USB设备传播&#xff0c;感染后&#xff0c;会向c2(fecure.info:443)请求指令来执行。 样本的基本信息 Verified: Unsigned Link date: 19:52 2007/7/5 MachineType: 32-bit MD5: 4B463901E5858ADA9FED28FC5…

CJSON工具类

4.4.3.CJSON工具类 OpenResty提供了一个cjson的模块用来处理JSON的序列化和反序列化。 官方地址&#xff1a; https://github.com/openresty/lua-cjson/ 1&#xff09;引入cjson模块&#xff1a; local cjson require "cjson"2&#xff09;序列化&#xff1a; …

STM32学习和实践笔记(21):定时器中断实验

通用定时器配置步骤如下&#xff1a; 第一步&#xff1a;使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 第二步&#xff1a;初始化定时器参数,包含自动重装值&#xff0c;分频系数&#xff0c;计数方式等 voidTIM_TimeBaseInit(TIM_T…

YJW-10000微机控制电液伺服压剪试验机

一、项目概述 YJW-10000微机控制电液伺服压剪试验机采用油缸下置式、四立柱结构&#xff0c;机架刚度强度高&#xff0c;变形小&#xff0c;满足公路、铁路桥梁板式、盆式、球型支座的检测要求&#xff0c;试验空间无级可调&#xff0c;方便不同高度的试验需求。采用试金自主研…

怎样快速插入数据

1、30万条数据插入插入数据库验证 1.1、表结构&#xff1a; CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT COMMENT 用户id,username varchar(64) DEFAULT NULL COMMENT 用户名称,age int(4) DEFAULT NULL COMMENT 年龄,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT…

如何设置微信自动回复?教你快速上手!

自动回复对于需要在微信上洽谈业务的人来说&#xff0c;无疑是非常实用的一个功能。 下面就一起来看看微信管理系统的机器人自动回复都有哪些设置吧&#xff01; 1、自动通过好友 只要有新的好友请求发送到你的微信账号&#xff0c;系统会自动通过该请求&#xff0c;无需手动…

vue flvjs 播放视频

写在前面&#xff1a; 之前使用过vodiejs插件播放过mp4视频格式的视频&#xff1b; 此次需要使用flvjs插件播放rtsp视频格式的视频&#xff1b; 因为视频的数据格式不同&#xff0c;所以对应的插件不同。 思维导图&#xff1a; 参考链接&#xff1a;rtmp、rtsp、flv、m3u8、 …

深度学习与目标检测:从卷积神经网络到YOLOv8概念介绍

深度学习与目标检测&#xff1a;从卷积神经网络到YOLOv8的深入探索 随着人工智能技术的迅猛发展&#xff0c;深度学习和计算机视觉领域取得了举世瞩目的成果。在目标检测这一关键任务中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;和YOLO系列模型发挥着至关重要的作用…