Vue3页面组件化开发

news2024/11/17 3:03:10

本节讲解Vue3页面组件化开发的原因和操作

1.原因

1.业务需求

2.页面展示

根据菜单选项展示不同的页面布局和页面信息

3.页面源码

<template>
    <div class="box">
        <div class="UserInfo">
            <div class="UserImg">
                <img src="../../assets/image/avator.jpg" alt="">
            </div>
            <div class="userTop">
                <div class="uTop">
                    <div class="userName">
                        {{ User.userName }}
                    </div>
                    <!-- <div class="infoManage">
                            <el-button></el-button>
                        </div> -->
                </div>
                <div class="uMiddle">
                    <span>{{ User.totalVisits }}</span>
                    <p>总访问量&emsp;|&emsp;</p>
                    <span>{{ User.original }}</span>
                    <p>原创&emsp;|&emsp;</p>
                    <span>{{ User.ranking }}</span>
                    <p>排名&emsp;|&emsp;</p>
                    <span>{{ User.fans }}</span>
                    <p>粉丝&emsp;&emsp;</p>
                </div>
                <div class="uBottom">
                    <span>IP属地:{{ User.IP }}</span>
                    <span>加入时间:{{ User.joinTime }}</span>
                    <span>博客简介:{{ User.blogInfo }}</span>
                </div>
            </div>
        </div>
        <div class="InfoMsg">
            <div class="leftMenu">

            </div>
            <div class="content">
                <div class="header">
                    <el-tabs v-model="contentTabs" class="demo-tabs" @tab-click="handleClick">
                        <el-tab-pane label="最近" name="first"></el-tab-pane>
                        <el-tab-pane label="文章" name="second"></el-tab-pane>
                        <el-tab-pane label="资源" name="third"></el-tab-pane>
                        <el-tab-pane label="问答" name="fourth"></el-tab-pane>
                        <el-tab-pane label="帖子" name="fifth"></el-tab-pane>
                        <el-tab-pane label="视频" name="sixth"></el-tab-pane>
                        <el-tab-pane label="关注/订阅/互动" name="seventh"></el-tab-pane>
                        <el-tab-pane label="收藏" name="eighth"></el-tab-pane>
                    </el-tabs>
                    <el-form v-model="queryParams">
                        <el-input type="text" v-model="queryParams.title" placeholder="搜TA的内容" />
                    </el-form>
                </div>
                <div class="body">
                    <ul v-show="this.contentTabs == 'first'">
                        <li v-for="item in items" :key="item">
                            <div class="ibox">
                                <div class="img_left">
                                    <img src="../../assets/image/avator.jpg" alt="">
                                </div>
                                <div class="content_right">
                                    <div class="title">{{ item.title }}</div>
                                    <div class="info">
                                        <p>{{ item.info }}</p>
                                    </div>
                                    <div class="footer">
                                        <el-tag :type="item.tags == 1 ? 'danger' : 'success'">{{ item.tags == 1
                                            ? "原创" : "转载" }}</el-tag>
                                        <span>发布时间:{{ item.publishTime }}</span>
                                        <span>{{ item.read }}&nbsp;阅读</span>
                                        <span>{{ item.like }}&nbsp;点赞</span>
                                        <span>{{ item.comment }}&nbsp;评论</span>
                                        <span>{{ item.collection }}&nbsp;收藏</span>
                                    </div>
                                </div>
                            </div>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
import { ref } from 'vue'
export default {
    data() {
        return {
            items: [
                {
                    title: "前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态",
                    info: "这里产生这个现象的原因和选中状态大致相同,那就是因为页面重新加载后之前的选中的CSS样式并没有清除,那么我们是不是在生命周期-创建的过程中把CSS样式清除就可以了呢?带着这个问题我查阅了一些资料并翻看了ElementPlus中我使用的组件el-menu、el-menu-item的CSS源码,发现想要清除CSS样式并不容易,甚至是无从下手,但是我们换个思路,既然无法在生命周期-创建中清除他的选中样式,那么我们直接全部清除他的选中样式不就解决问题了吗,但是我",
                    tags: 1,
                    publishTime: "2021-01-01",
                    read: 100,
                    like: 100,
                    comment: 100,
                    collection: 100
                },
                {
                    title: "前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态",
                    info: "这里产生这个现象的原因和选中状态大致相同,那就是因为页面重新加载后之前的选中的CSS样式并没有清除,那么我们是不是在生命周期-创建的过程中把CSS样式清除就可以了呢?带着这个问题我查阅了一些资料并翻看了ElementPlus中我使用的组件el-menu、el-menu-item的CSS源码,发现想要清除CSS样式并不容易,甚至是无从下手,但是我们换个思路,既然无法在生命周期-创建中清除他的选中样式,那么我们直接全部清除他的选中样式不就解决问题了吗,但是我",
                    tags: 0,
                    publishTime: "2021-01-01",
                    read: 100,
                    like: 100,
                    comment: 100,
                    collection: 100
                }
            ],
            contentTabs: ref("first"),
            queryParams: {
                title: ""
            },
            User: {
                userName: "法外狂徒张三",
                totalVisits: 18307,
                original: 543,
                ranking: 2343,
                fans: 2983431,
                IP: "北京市",
                joinTime: "2021-01-01",
                blogInfo: "我是一个程序员"
            }
        }
    },
    methods: {
        handleClick(tab, event) {
            console.log(tab.props.name);
            this.contentTabs = tab.props.name;
        }
    }
}
</script>
<style>
.box .InfoMsg .content .el-tabs__item {
    font-size: 17px !important;
}
</style>
<style lang="scss" scoped>
.box {
    width: 100%;
    height: auto;
    margin-top: 50px;

    .UserInfo {
        width: 100%;
        height: 138px;
        display: flex;
        flex-direction: row;
        border-bottom: 10px solid black;

        .UserImg {
            display: flex;
            width: 118px;
            height: 118px;
            margin: -40px 0 0 48px;
            border-radius: 50%;
            border: 5px solid rgb(240, 240, 242);

            img {
                min-height: 118px;
                min-width: 118px;
                border-radius: 100%;
            }
        }

        .userTop {
            width: 90%;
            height: 140px;
            margin: 0 auto;
            display: flex;
            flex-direction: column;
            overflow: hidden;

            .uTop {
                width: 100%;
                height: 40%;

                .userName {
                    width: 30%;
                    height: 100%;
                    font-size: 30px;
                    display: flex;
                    justify-content: flex-start;
                    align-items: flex-end;
                    padding-left: 20px;

                }
            }

            .uMiddle,
            .uBottom {
                width: 100%;
                height: 25%;
                display: flex;

                p {
                    margin: 10px 0 10px 10px;
                    font-size: 14px;
                }

                span {
                    width: auto;
                    display: block;
                    padding: 0 0 0 10px;
                    font-size: 25px;
                    // font-weight: bold;
                }

                span:nth-child(1) {
                    margin-left: 12px;
                }
            }

            .uBottom {
                display: flex;
                flex-direction: row;
                justify-content: flex-start;
                align-items: flex-end;
            }

            .uBottom span {
                font-size: 14px;
                margin-right: 100px;
            }
        }
    }

    .InfoMsg {
        width: 100%;
        min-height: calc(100vh - 160px);
        display: flex;
        overflow: hidden;

        .leftMenu {
            min-width: 300px;
            max-height: 648px;

        }

        .content {
            width: auto;
            height: auto;
            border-left: 10px solid black;

            .header {
                width: 100%;
                display: flex;
                padding: 0 15px 0 25px;

                .demo-tabs {
                    width: 700px;
                    height: 100%;
                    padding-left: 20px;

                    ::v-deep .el-tabs__nav-wrap::after {
                        background-color: white;
                    }
                }

                .el-form {
                    width: 300px;
                    display: flex;
                    justify-content: flex-end;
                    align-items: flex-start;
                    padding: 5px 30px 0 0;

                    .el-input {
                        font-size: 17px;
                        width: 170px;

                    }
                }
            }

            .body {
                width: 100%;
                max-height: 900px;
                overflow-y: scroll;

                ul {
                    list-style: none;
                    margin: 0;
                    padding: 0;

                    li {
                        width: 90%;
                        margin: 0 auto;
                        height: 150px;
                        padding: 10px 0;
                        border-bottom: 1px solid darkgray;
                        cursor: pointer;

                        .ibox {
                            width: 100%;
                            height: 100%;
                            display: flex;
                            align-items: center;

                            .img_left {
                                width: 180px;
                                height: 120px;
                                margin: 0 10px 0 20px;

                                img {
                                    width: 100%;
                                    height: 100%;
                                }
                            }

                            .content_right {
                                width: calc(100% - 230px);
                                height: 120px;
                                display: flex;
                                flex-direction: column;
                                align-items: flex-start;

                                .title,
                                .info,
                                .footer {
                                    width: 100%;
                                }

                                .title {
                                    height: 30px;
                                    font-size: 22px;
                                    font-weight: bold;
                                    text-align: left;
                                    overflow: hidden;
                                }

                                .info {
                                    height: calc(100% - 65px); //90字后省略
                                    overflow: hidden;
                                    white-space: normal;

                                    p {
                                        width: 100%;
                                        height: 100%;
                                        margin: 10px 0 10px 0;
                                        text-indent: 2em;
                                    }
                                }

                                .footer {
                                    height: 28px;
                                    display: flex;
                                    flex-direction: row;
                                    align-items: flex-end;

                                    span {
                                        margin-left: 5px;
                                        margin-right: 25px;
                                        font-size: 15px;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            .body::-webkit-scrollbar {
                width: 1px;
                height: 1px;
            }

            .body::-webkit-scrollbar-track {
                border-radius: 0;
                box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1);
                background: black;
            }

            .body::-webkit-scrollbar-thumb {
                border-radius: 10px;
                box-shadow: inset 0 0 5px rgba(27, 190, 208, 0.7);
                background: white;
            }

        }
    }

}
</style>

源码中div.body下的ul仅用于展示了第一个菜单"最近"页面的信息,仅一个页面布局用了24行,css样式86行,一个菜单子页面110行,8个子菜单页面写完加上主体页面将近1000行代码,无论后期对页面的维护还是二次开发,这么大的代码量对程序员都是一个很大的挑战,故对于这种长代码的页面我们要采用以功能为单位进行划分,以组件为单位进行开发的思想

2.操作

操作1

1.提取子页面相关的CSS样式和代码放入一个新的vue文件中

<style lang="scss" scoped>
ul {
    list-style: none;
    margin: 0;
    padding: 0;

    li {
        width: 90%;
        margin: 0 auto;
        height: 150px;
        padding: 10px 0;
        border-bottom: 1px solid darkgray;
        cursor: pointer;

        .ibox {
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;

            .img_left {
                width: 180px;
                height: 120px;
                margin: 0 10px 0 20px;

                img {
                    width: 100%;
                    height: 100%;
                }
            }

            .content_right {
                width: calc(100% - 230px);
                height: 120px;
                display: flex;
                flex-direction: column;
                align-items: flex-start;

                .title,
                .info,
                .footer {
                    width: 100%;
                }

                .title {
                    height: 30px;
                    font-size: 22px;
                    font-weight: bold;
                    text-align: left;
                    overflow: hidden;
                }

                .info {
                    height: calc(100% - 65px); //90字后省略
                    overflow: hidden;
                    white-space: normal;

                    p {
                        width: 100%;
                        height: 100%;
                        margin: 10px 0 10px 0;
                        text-indent: 2em;
                    }
                }

                .footer {
                    height: 28px;
                    display: flex;
                    flex-direction: row;
                    align-items: flex-end;

                    span {
                        margin-left: 5px;
                        margin-right: 25px;
                        font-size: 15px;
                    }
                }
            }
        }
    }
}
</style>

操作2

操作3

父组件引入 

操作4

 页面效果

无异

 

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

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

相关文章

云计算第三阶段---DBA数据库管理

Day1 一.数据库概述 计算机中数据存放的仓库&#xff0c;可以按数据类型划分数据库&#xff0c;又可以在数据库中划分更细节的分类存放到相应的表中。 抽象来说就是生活中的菜市场、五金店之类的场所&#xff0c;根据用途开设&#xff1b;划分广泛的还有百货商场、批发市场等…

HarmonyOS应用程序访问控制探究

关于作者 白晓明 宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人 华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL 华为开发者学堂/51CTO学堂/CSDN学堂认证讲师 开放原子开源基金会2023开源贡献之星 一、引言 随着信息技术的飞速发展&#xff0c;移动应用程序已经成为…

【C++】实现日期类相关接口

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇 本篇将介绍实现日期类中众多接口&#xff0c;同时这其中涉及到很多知识&#xff0c;务必将类和对象相关内容掌握再来实现日期类…

【数据结构】详细介绍栈和队列,解析栈和队列每一处细节

目录 一. 栈 1. 栈的概念 2. 栈的实现 2.1 栈的结构 2.2 初始化栈 2.3 入栈 2.4 出栈 2.5 获取栈顶元素 2.6 获取栈中有效个数 2.7 判断栈是否为空 2.8 销毁栈 二. 队列 1. 队列的概念 2. 队列的实现 2.1 队列的结构 2.2 队列初始化 2.3 销毁队列 2.4 入…

聊聊适配器模式

目录 适配器模式概念 主要实现方式 主要组成 UML用例图 代码示例 生活场景 应用场景 适配器模式概念 适配器模式属于结构型设计模式&#xff0c;它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式&#xff0c;使得原本接口不兼容的类可以一起工作。 主…

【New SQL】 -- CockroachDB license change

1、CockroachDB 发布了修改开源协议的 releases 北京时间 2024-08-16 &#xff0c;CockroachDB 发布了修改开源协议的 releases。 原文链接&#xff1a;Licensing FAQs Evolving our self-hosted offering and license model CockroachDB License change (again) | Product T…

Kali Linux 定制化魔改 添加常见60渗透工具

项目地址&#xff1a;https://github.com/CuriousLearnerDev/kali-linux-kde-beautify 系统版本&#xff1a;kali linux 2024.1 固件类型&#xff1a;BIOS 用户: zss 密码: ss 完整版 系统压缩大小&#xff1a;18.8 GB 解出来&#xff1a;36.00GB 左右 系统版 系统压缩大小&…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 04路由协议的选择

本章要回答的问题&#xff1a; 路由是如何工作的?有哪些类型的路由协议?Clos 拓扑中的路由协议是如何工作的?什么是无编号接口&#xff0c;以及为什么无编号接口如此重要?如何确定最适合自己需求的路由协议? 路由概述 用最简单的话来说&#xff0c;路由是使用数据包的目…

DESeq2差异基因分析和批次效应移除

差异基因鉴定 基因表达标准化 不同样品的测序量会有差异&#xff0c;最简单的标准化方式是计算counts per million (CPM)&#xff0c;即原始reads count除以总reads数乘以1,000,000。 这种计算方式的缺点是容易受到极高表达且在不同样品中存在差异表达的基因的影响&#xff…

FunClip,音视频识别,自动化剪辑,文本校对,智能纠错,导出SRT

今天给大家介绍一个自动化剪辑项目——FunClip,该项目是由阿里开源的&#xff0c;可以识别音频、视频中的文字&#xff0c;一键剪辑和添加字幕。 FunClip是一款高效的自动化视频剪辑工具&#xff0c;它利用语音识别技术对视频内容进行分析。用户可以在识别结果中选择所需的文本…

重生奇迹MU 梦幻骑士 真正生而高贵的职业

作为重生奇迹MU梦幻骑士中真正生而高贵的职业&#xff0c;圣骑士是玩家们最为追捧的职业之一。在游戏内&#xff0c;圣骑士拥有着强大的防御和治疗能力&#xff0c;成为团队中不可或缺的存在。如果你正准备选择一个强大的职业&#xff0c;那么不妨考虑成为一名圣骑士&#xff0…

选择文件摆渡系统要遵守的“三要”和“三不要”原则

文件摆渡系统不仅可以实现企业网络隔离后的数据摆渡需求&#xff0c;同时也可以视作企业数据安全及网络安全建设的重要组成部分。文件摆渡系统的选择也很关键&#xff0c;在企业进行筛选时&#xff0c;应该遵守“三要”和“三不要”原则。 “三要”之一&#xff1a;要安全 文件…

MySQL对事务的支持

5.MySQL对事务的支持情况&#xff1a; 5.1. 查看存储引擎对事务的支持情况 &#xff1a; 1.SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务2.下图可以能看出在 MySQL 中&#xff0c;只有InnoDB类型的存储引擎是支持事务…

轻松搞定 Java7 新特性,示例丰富

Java 7 是 Java 语言的一个主要版本&#xff0c;于 2011 年 7 月 28 日正式发布。 由 Sun Microsystems 开发并由 Oracle 公司发布的一个重要版本&#xff0c;它带来了许多新功能特性&#xff0c;增强了编程语言的能力和性能。 以下是一些 Java 7 的主要新功能特性&#xff1…

基于SSM的体育馆预约管理系统---附源码84196

摘 要 体育馆作为一个重要的运动场所&#xff0c;需要进行预约管理以保证资源的合理利用和场馆秩序的维护。传统的人工预约管理方式存在效率低、容易出错等问题&#xff0c;因此&#xff0c;在互联网高速发展的当下&#xff0c;需要设计和实现一个基于SSM的体育馆预约管理系统&…

关于LLC知识9

1、上图有多条增益曲线&#xff0c;是每种不同的输出负载都对应一条增益曲线&#xff0c;在f1时候每个曲线都汇聚一点&#xff0c;说明只要输出电压频率f1时&#xff0c;不论输出负载是多少&#xff0c;增益是一样的&#xff0c;不受负载影响G1&#xff08;Lr与Cr发生谐振&…

[单master节点k8s部署]21.EFK日志收集平台介绍

大型系统是一个分布式部署的架构&#xff0c;不同的服务模块部署在不同的服务器上&#xff0c;问题出现时&#xff0c;大部分情 况需要根据问题暴露的关键信息&#xff0c;定位到具体的服务器和服务模块&#xff0c;构建一套集中式日志系统&#xff0c;可以提高 定位问题的效率…

构建自己的语音助手

在我最近发布关于如何构建自己的 RAG 并在本地运行它的帖子之后。今天&#xff0c;我们更进一步&#xff0c;不仅实现了大型语言模型的对话能力&#xff0c;还增加了听力和口语能力。这个想法很简单&#xff1a;我们将创建一个语音助手&#xff0c;让人想起标志性钢铁侠电影中的…

基于asp.net的办公协同管理系统源码分享

今天给大家分享一个asp.net开发的webform框架的办公协同管理系统源码SQLserver数据库 1.主要功能 这个项目是帮助一个学生指导的毕业设计&#xff0c;包含用户登陆、用户管理、车辆 管理、文件管理、个人中心、后台管理、文件上传、人事管理、系统日志等 等模块。2.开发工具及…

【Django-vue-admin学习笔记】页面自动计算日期差额的方法

在许多应用场景中,尤其是在管理系统中,经常需要对日期进行动态计算和展示,以帮助用户了解关键日期的即时状态。例如,在学生宿舍管理系统中,显示学生的退宿倒计时可以帮助管理人员有效监控即将到期的宿舍安排,并及时进行必要的调整。这样的功能不仅提高了管理效率,也增加…