循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

VUE+Element 前端应用,比较不错的一点就是界面组件化,我们可以根据重用的指导方针,把界面内容拆分为各个不同的组合,每一个模块可以是一个组件,也可以是多个组件的综合体,而且这一个过程非常方便。组件封装的目的就是为了能够更加便捷、快速的进行业务功能的开发。组件(component)是vue的最强大功能之一,组件可以实现一些类似功能的复用及与其它业务逻辑的解耦。本篇随笔介绍前端框架中常用到的一些组件封装处理,用于简化界面、隐藏实现细节的目的。

1、组件封装的需要

在我们开发一个主要界面的时候,一般需要排列很多内容,各个部分的内容可能会在其他界面上比较常见,那么这些如果是简单的使用原始的Element界面组件,以及简单的复制处理的话,页面代码比较臃肿,而且随着不断的复制过去使用,各部分的界面又不在统一了。这个时候如果把那些相同的功能,抽象出来抽离成组件,通过组件引用方式就会显得格外省事了。

在Winform开发中,我们知道有很多常见的用户自定义控件,就是对常规界面内容的一些通用部分进行封装,拖动过来即可使用。现在VUE+Element 前端应用的组件开发也很容易,把界面代码和Vue的控制逻辑JS代码组合一起形成一个小组件,通过使用Prop的方式传入所需参数,由组件内部控制界面的展示逻辑及事件处理,那么界面调用组件的时候就非常简洁,这样我们主页面上的代码量就降低不少,也方便代码的维护。

例如对于常规的字典下拉列表,我们希望绑定一个字典类型就可以实现系统的下拉列表的显示,那么我们可以封装这个常见的界面内容为一个字典组件。

还有对于树列表及其过滤实现等常规的处理,我们也可以通过简单的封装,实现树列表的展示,这样我们传入对应的树列表数据即可呈现所需要的树状列表内容。

另外,还有一种情况,是界面内容太多,我们把它按内容划分为不同的界面组件,然后页面进行独立的维护,主界面直接一行代码即可集成所需的内容板块,极大减少主界面的代码铺陈。

例如:对于权限系统中的每个角色,除了包含基本信息外,还会包含拥有的权限(功能控制点)、包含用户,以及拥有的菜单,其中权限是用来控制界面元素,如操作按钮的显示的,而拥有的菜单,则是用户以指定账号登录系统后,获得对应角色的菜单,然后构建对应的访问入口的。角色界面模块UML类图如下所示。

那么对应界面元素上,我们就应该以不同的Tab来展示这些信息,每个Tab内容部分就可以作为一个独立的界面组件来开发。

在比如,组织机构里面添加成员和添加角色的操作UML图。

其中添加成员、添加角色,涉及界面的列表数据展示以及对应的添加展示操作,独立一个界面组件还是比较方便的,而且添加成员 ,在角色维护模块里面也需要用到,那么可以兼容两个场景来设计组件模块。

 

2、界面组件的封装处理

在VUE+Element 的前端场景中,想要封装好一个组件,一般要熟练掌握的三个技能:1、父组件传值到子组件(props) 2、子组件传值到父组件($emit)3、插槽使用(slot)。对于一个独立的组件,props是用来为组件内部注入核心内容;$emit用来使这个组件通过一些操作来融入其它组件中。

我们来详细分析下前面介绍的组件场景。

对于字典模块来说,一般如果需要实现和系统字典模块里面的Api对接,并展示对应字典类型的下拉列表,实现代码如下所示。

<el-select v-model="searchForm.ProductType" filterable clearable placeholder="请选择">
  <el-option
    v-for="(item, key) in typeList"
    :key="key"
    :label="item.value"
    :value="item.key"
  />
</el-select>

然后在JS逻辑里面使用字典的API获取对应数据,然后绑定到typeList属性上面即可。这样的逻辑如果每个用到字典的地方都需要这样处理,代码显然比较臃肿,而且使用组件封装更方便。

我们在Componen目录下创建一个Common目录,然后在其中添加一个my-dictdata.vue文件,用来封装字典内容处理的。

如果我们完成组件的编写,那么引用组件只需要一行代码即可实现相同的功能了。

<my-dictdata v-model="searchForm.ProductType" type-name="商品类型" />

以及在页面的组件里面引入这个自定义组件即可。

import myDictdata from '@/components/Common/my-dictdata'
export default {
  components: { myDictdata },

如果为了简便,也可以在main.js里面统一全局引入。

这样相对于使用原始的Element界面组件,既有界面代码,又有JS代码,这样的一行代码就实现功能,显得非常简洁。

 

为了了解其中的奥秘,我们对组件的开发过程进行简单的了解,其中组件界面部分的代码如下所示,和上面的差不多。

<template>
  <el-select v-model="svalue" filterable clearable placeholder="请选择">
    <el-option
      v-for="(item, index) in dictItems"
      :key="index"
      :label="item.Text"
      :value="item.Value"
    >
      <span style="float: left;color:yello;">
        <i class="el-icon-tickets" style="color:blue;" />
        {{ item.Text }}
      </span>
    </el-option>
  </el-select>
</template>

然后在JS部分引入字典操作的Api类,以及定义Prop属性typeName,如下所示。

并对传入Model值进行监控

我们在Mounted的实现里面,增加对字典数据的请求绑定,如下所示。

对于树形列表

一般来说它的使用代码如下所示。

还是可以感觉比较臃肿,如果放到主页面里面,会占用很多代码行,维护起来也不方便,而且树列表也是一个常见的界面展示内容,可以通过简单的封装进行减少主页面的代码量。

同样我们可以通过封装一个树列表组件

我们可以在my-tree.vue里面定义很多常见的的Prop属性,以方便调用的时候传入对应的值来改变界面的呈现。

这样主界面调用组件来实现功能的时候,只需要一行界面代码即可。

<myTree :data="treedata" icon-class="el-icon-price-tag" @nodeClick="nodeClick" />

相应的处理获得treedata的操作,是下面的函数

getTree() { // 树列表数据获取
      var param = {
        SkipCount: 0,
        MaxResultCount: 1000,
        Tag: 'web' // Web端专用
      }
      menu.GetAll(param).then(data => {
        this.treedata = [];// 树列表清空
        var list = data.result.items
        if (list) {
          // 使用getJsonTree函数,实现对二维表转换为嵌套树对象集合
          var newTreedata = getJsonTree(list, {
            id: 'id',
            pid: 'pid',
            children: 'children',
            label: 'name'
          });
          this.treedata = newTreedata
        }
      });
    },

而对于部分页面组件的方式,这种一般不是很通用的组件,一般我们可以把它放在同一个目录上的Components目录里面,如下是权限模块里面用到的一些界面内容组件封装。

完成添加成员、添加角色的界面组件后,我们就可以在组织机构界面里面引入使用。

角色管理,我们也依据这个来对模块的内容进行划分,不同业务设计不同的界面组件,最后整合一起使用即可。

<el-dialog title="查看信息" :visible="isView" :modal-append-to-body="false" @close="closeDialog">
  <el-col>
    <el-tabs value="basicPage" type="border-card">
      <el-tab-pane name="basicPage" label="基本信息">
        <el-form ref="viewForm" :model="viewForm" label-width="120px">
          <el-form-item label="角色名">
            <el-input v-model="viewForm.name" disabled />
          </el-form-item>
          <el-form-item label="角色显示名">
            <el-input v-model="viewForm.displayName" disabled />
          </el-form-item>
          <el-form-item label="角色描述">
            <el-input v-model="viewForm.description" type="textarea" disabled />
          </el-form-item>
        </el-form>
      </el-tab-pane>
      <el-tab-pane name="permitPage" label="权限">
        <rolefunction ref="rolefunction" :role-id="selectRoleId" />
      </el-tab-pane>
      <el-tab-pane name="userPage" label="用户">
        <roleuser ref="roleuser" :role-id="selectRoleId" :can-add="false" :can-delete="false" />
      </el-tab-pane>
      <el-tab-pane name="menuPage" label="菜单">
        <rolemenu ref="rolemenu" :role-id="selectRoleId" />
      </el-tab-pane>
    </el-tabs>
  </el-col>
  <div slot="footer" class="dialog-footer">
    <el-button type="success" @click="closeDialog">关闭</el-button>
  </div>
</el-dialog>

或者

以上就是我们封装一些常见通用组件,以及页面模块的组件,主要的目的就是可以简化主调用界面的代码,以及提高使用的效率。

 

为了方便读者理解,我列出一下前面几篇随笔的连接,供参考:

循序渐进VUE+Element 前端应用开发(1)--- 开发环境的准备工作

循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用

循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理

循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

循序渐进VUE+Element 前端应用开发(5)--- 表格列表页面的查询,列表展示和字段转义处理

循序渐进VUE+Element 前端应用开发(6)--- 常规Element 界面组件的使用

循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

循序渐进VUE+Element 前端应用开发(8)--- 树列表组件的使用

循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理

循序渐进VUE+Element 前端应用开发(10)--- 基于vue-echarts处理各种图表展示

循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用

循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理

循序渐进VUE+Element 前端应用开发(13)--- 前端API接口的封装处理

循序渐进VUE+Element 前端应用开发(14)--- 根据ABP后端接口实现前端界面展示

循序渐进VUE+Element 前端应用开发(15)--- 用户管理模块的处理

循序渐进VUE+Element 前端应用开发(16)--- 组织机构和角色管理模块的处理

循序渐进VUE+Element 前端应用开发(17)--- 菜单管理

循序渐进VUE+Element 前端应用开发(18)--- 功能点管理及权限控制  

VUE+Element 前端应用开发框架功能介绍

循序渐进VUE+Element 前端应用开发(19)--- 后端查询接口和Vue前端的整合

使用代码生成工具快速生成基于ABP框架的Vue+Element的前端界面

循序渐进VUE+Element 前端应用开发(20)--- 使用组件封装简化界面代码

循序渐进VUE+Element 前端应用开发(21)--- 省市区县联动处理的组件使用

循序渐进VUE+Element 前端应用开发(22)--- 简化main.js处理代码,抽取过滤器、全局界面函数、组件注册等处理逻辑到不同的文件中

循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

循序渐进VUE+Element 前端应用开发(25)--- 各种界面组件的使用(1)

循序渐进VUE+Element 前端应用开发(26)--- 各种界面组件的使用(2)

电商商品数据库的设计和功能界面的处理

循序渐进VUE+Element 前端应用开发(27)--- 数据表的动态表单设计和数据存储

循序渐进VUE+Element 前端应用开发(28)--- 附件内容的管理

循序渐进VUE+Element 前端应用开发(29)--- 高级查询条件的界面设计

部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用

循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理

循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

循序渐进VUE+Element 前端应用开发(32)--- 手机短信动态码登陆处理

循序渐进VUE+Element 前端应用开发(33)--- 邮件参数配置和模板邮件发送处理

使用代码生成工具快速开发ABP框架项目

使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理

使用Vue-TreeSelect组件的时候,用watch变量方式解决弹出编辑对话框界面无法触发更新的问题

 

专注于代码生成工具、.Net/.NetCore 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架等框架产品。
 转载请注明出处:撰写人:伍华聪  http://www.iqidi.com
   


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】React与Vue:前端框架的巅峰对决与选择策略
|
1天前
|
前端开发 JavaScript 数据管理
React与Vue:两大前端框架的较量与选择策略
【10月更文挑战第23天】React与Vue:两大前端框架的较量与选择策略
|
3天前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
8 1
|
3天前
|
前端开发 API
前端界面生成PDF并导出下载
【10月更文挑战第21天】利用合适的第三方库,你可以在前端轻松实现界面生成 PDF 并导出下载的功能,为用户提供更方便的文档分享和保存方式。你还可以根据具体的需求进一步优化和定制生成的 PDF 文件,以满足不同的业务场景要求。
|
6天前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
1天前
|
前端开发 JavaScript 开发者
React与Vue:前端框架的巅峰对决与选择策略
【10月更文挑战第23天】 React与Vue:前端框架的巅峰对决与选择策略
|
14天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
14天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
30 0
|
14天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
14天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。