使用VUE自定义组件封装数据字典实战

news2024/11/18 7:50:10

背景

照惯例,先交待下背景,从真实需求出发,讲述设计思路和实现方式。
软件系统中,会有一些成组的常量值,来描述业务实体的属性,如性别、证件类型、审批状态等。我们通常称之为数据字典,作为系统后台管理的一个独立功能,来维护字典类型以及对应的字典值。后端功能和实现都比较简单,没什么好说的,今天重点要说的是前端的封装。

设计与实现

对于数据字典,前端展现往往有三种常用的形式,下拉列表、单选按钮组和复选框组,其中,最常用是下拉列表,这里就以下拉列表的实现为例来说明,其他两种类似,不重复描述。

技术栈采用的还是vue2.0,UI组件库使用element ui。element ui提供了Select 选择器(传送门:https://element.eleme.cn/#/zh-CN/component/select),实现效果如下:
在这里插入图片描述

官方示例代码如下:

<template>
  <el-select v-model="value" placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item.value">
    </el-option>
  </el-select>
</template>

<script>
  export default {
    data() {
      return {
        options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }],
        value: ''
      }
    }
  }
</script>

这是从纯前端角度来展示如何使用,在软件系统中,数据是来自于后端的,也就是前端需要调用后端的api,拿到数据来填充列表。

直接使用select组件,是不是可以呢?答案是可以用,但用起来比较繁琐,需要在页面加载的时候,调用后端API接口拿数据,在data中定义存放字典数据的变量,并且一个实体编辑页面,使用到字典属性往往不止一个,三五个也比较常见,这时候,需要定义多个变量来存放字典项以及加载数据,开发工作量变大且容易出错。
那有没有办法让使用变得更方便呢?答案也简单,就是自定义封装一个组件来实现。我们的目标是传入一个数据字典的类型编码,组件内部调用后端API,完成数据的加载与存储,在选择项变化时,自动更新绑定的对应的业务实体的属性值。同时,在业务实体的编辑页面,也能自动绑定和显示已选择的字典项。

封装是在elment ui的select组件的基础上进行的,先附上完整源码。

<template>
  <el-select
    :value="value"
    :size="size"
    clearable
    :multiple="multiple"
    :disabled="readonly"
    style="width:100%;margin:0px auto;"
    @change="change"
  >
    <el-option
      v-for="item in dictionaryItemList"
      :key="item.code"
      :value="item.code"
      :label="item.label"
    />
  </el-select>
</template>

<script>

export default {
  model: {
    prop: 'value',
    event: 'change'
  },
  props: {
    value: {
      type: [String, Array],
      required: false,
      default: ''
    },
    code: {
      type: String,
      default: ''
    },
    readonly: {
      type: Boolean,
      required: false,
      default: false
    },
    size: {
      type: String,
      default: ''
    },
    multiple: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      dictionaryItemList: []
    }
  },
  watch: {
    code: {
      immediate: true,
      handler: 'loadData'
    }
  },
  methods: {
    change(value) {
      this.$emit('change', value)
    },
    loadData() {
      if (this.code) {
        this.dictionaryItemList = []
        this.$api.system.dictionaryType.getItem(this.code).then(res => {
          this.dictionaryItemList = res.data
        })
      }
    }
  }
}
</script>

下面重点说下封装自定义组件需要注意的点。
1.很重要的一点,是设置model选项。因为默认情况下,model使用名为 value 的 prop 和名为 input 的事件,对于我们要封装的select组件,事件应该使用chang而不是input,所以需要做如下设置:

 model: {
    prop: 'value',
    event: 'change'
  }

2.不仅要考虑单选情况,还需要考虑多选情况,因此value属性,类型是一个数组,可以是String,也可以是Array。

 value: {
      type: [String, Array],
      required: false,
      default: ''
    }

3.为了组件的可配置性,将select组件自身的属性,设置为prop属性,这样在使用的时候,就能通过属性绑定的方式灵活配置了。

  	readonly: {
      type: Boolean,
      required: false,
      default: false
    },
    size: {
      type: String,
      default: ''
    },
    multiple: {
      type: Boolean,
      default: false
    }

4.code是最重要的属性,即我们上面提到的数据字典类型的编码,是后端查找字典项的依据。需要注意的是,这里并未使用mounted事件来加载数据,而是使用了watch来监控该值的变化。这么做是考虑到在某些业务场景下,需要动态刷新下拉列表的数据项,如多个下拉列表联动。

 watch: {
    code: {
      immediate: true,
      handler: 'loadData'
    }
  }
   ……
 loadData() {
  if (this.code) {
    this.dictionaryItemList = []
    this.$api.system.dictionaryType.getItem(this.code).then(res => {
      this.dictionaryItemList = res.data
    })
  }
 }

5.选择项变化时,通过change事件,调用emit,把最新的值传递给使用方,这一步很关键。

 change(value) {
      this.$emit('change', value)
 }

整体而言,封装工作并不复杂,下面看下使用方如何来调用

  <!--表单区域 -->
      <el-form-item label="名称" prop="name">
        <el-input v-model="entityData.name" :readonly="readonly" />
      </el-form-item>
      <el-form-item label="编码" prop="code">
        <el-input v-model="entityData.code" :readonly="readonly" />
      </el-form-item>  
      <el-form-item label="数据类型" prop="dataType">
        <dictionary-select
          v-model="entityData.dataType"
          :code="constant.ENTITY_MODEL_PROPERTY_TYPE"
          :readonly="readonly"
        
        />
      </el-form-item>

      <el-form-item label="控件类型" prop="widgetType">
        <dictionary-select
          v-model="entityData.widgetType"
          :code="widgetType"
          :readonly="readonly"
        />

  

效果图如下:
在这里插入图片描述

通过封装后,整个下拉列表就成为了一个相对独立的组件了。只需要传入一个数据字典类型的编码,就能自动加载数据,更新绑定,对于使用的页面,无需定义额外的字典项存储变量,是不是很简洁方便?

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

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

相关文章

Seata

Seata的三大角色 TC&#xff08;Transaction Coordinator&#xff09;-事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM&#xff08;Transaction Manager&#xff09;-事务管理器 定义全局事务的范围&#xff1a;开始全局事务、提交或回滚全局…

图片怎么编辑里面的文字?这篇文章告诉你方法

大家平时在分享自己拍摄的照片时&#xff0c;会不会觉得照片有点单调&#xff0c;留白面积大呢&#xff1f;其实这时候&#xff0c;我们可以给图片添加一些文字描述&#xff0c;就能够丰富图片的内容&#xff0c;并且我们也可以将这些加文字的图片当做表情包来使用。那么你们知…

【人工智能】【总结】CMSC5707 Advanced Topics in Artificial Intelligence

文章目录1. 音频信号处理介绍2. 音频信号预处理3. 特征4. 特征重现5. 语音识别6. AdaBoost7. 人脸识别8. 神经网络9. 卷积神经网络10. Auto-Encoder11. 循环神经网络 和 LSTM12. Word Representation13. 决策树1. 音频信号处理介绍 x KHz, y bit, n s 多少 byte: x∗1000∗y/8…

【12月9日更新1/4决赛预测】用二元泊松模型预测2022年世界杯淘汰赛结果

用二元泊松模型预测2022年世界杯淘汰赛结果 网上有很多文章用双泊松&#xff08;Double Poisson&#xff09;模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷&#xff0c;那就是它假设比赛中两队的比分是条件独立的。而我们都知道&#xff0c;在对抗性比赛中&…

【PCB设计】孔间距不可忽视,小心废板!

为什么有时候明明PCB设计没有检查出错误&#xff0c;但是在生产加工后还是出现短路、断板等不良情况&#xff1f; 那是因为你没有考虑到孔间距问题&#xff0c;导致在装配过程中无法避免的产生损耗。 PCB单面板或双面板的制作&#xff0c;都是在下料之后&#xff0c;直接进行非…

商品信息管理系统(Python)完整版

目录 功能模块&#xff1a; 实现思路&#xff1a; 运行功能演示&#xff1a; 具体实现过程&#xff1a; 定义商品类&#xff1a; 定义商品管理类 定义显示商品信息函数 输入销量函数&#xff1a; 添加商品信息&#xff1a; 删除商品信息 修改商品信息 导入商品信息…

Linux下安装Zookeeper教程

ZooKeeper 简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服…

字符串匹配算法(BFRK)

文章目录题目一、BF算法二、RK算法补充题目 有字符串 str1 和 str2 &#xff0c;str1 中是否包含 str2&#xff0c;如果没有包含返回 -1&#xff0c;如果包含&#xff0c;则返回 str2 在 str1 中开始的位置 注&#xff1a;保证 str1 和 str2 字符串的长度大于 0 举例&#x…

k8s-kubeadm安装1.25.5

准备环境&#xff1a; 想体验下新的版本 主机名IP资源k8s-master192.168.1.1912u2G内存20G磁盘k8s-node192.168.1.1922u2G内存20G磁盘 1 修改主机名&#xff0c;配置hosts文件 # 修改主机名 hostnamectl set-hostname k8s-master hostnamectl set-hostname k8s-node # 修改h…

CMMI2.0配置管理工作及访谈学习笔记(续)

1. 配置管理岗位职责 范围&#xff1a;组织级和项目级配置管理管理对象为过程和产品&#xff0c;产品为识别出的配置项建立配置库&#xff1a;为项目建立开发库&#xff08;管理库&#xff09;、基线库&#xff0c;建立配置库结构并分配权限&#xff08;命名规范&#xff09;基…

猿如意中的【DBeaver】工具详情介绍

猿如意中的【DBeaver】工具详情介绍一、工具名称二、下载安装渠道2.1 什么是猿如意&#xff1f;2.2 如何下载猿如意&#xff1f;2.3 如何在猿如意中下载开发工具&#xff1f;三、工具介绍四、DBeaver功能介绍五、软件截图六、DBeaver安装过程6.1 在猿如意中下载DBeaver6.2 选择…

道路裂缝坑洼图像开源数据集汇总

CrackForest数据集 数据集下载链接&#xff1a;http://suo.nz/2wdNdX CrackForest数据集是一个带注释的道路裂缝图像数据库&#xff0c;可以大致反映城市路面状况。 道路裂缝坑洼图像数据集 数据集下载链接&#xff1a;http://suo.nz/3eEDlj 这个数据集是一个极具挑战性的集…

67、INGeo:利用占用网格先验加速/减少迭代次数

简介 论文地址&#xff1a;INGeo: Accelerating Instant Neural Scene Reconstruction with Noisy Geometry Priors 首先我们知道Instant-ngp利用最先进的射线推进技术&#xff08;指数步进、空白跳过、样本压缩&#xff09;实现密集网格自剪枝的采样策略&#xff0c;这种采样…

代码随想录训练营第48天|LeetCode 198.打家劫舍、213.打家劫舍II、 337.打家劫舍III

参考 代码随想录 题目一&#xff1a;LeetCode 198.打家劫舍 确定dp数组下标及其含义 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;可以偷窃的最大金额为dp[i]。确定递推公式 如果当前的第i个房间不偷&#xff0c;那么dp[i] dp[i-1].如…

干货收藏 |关键词优化攻略!(附11款关键词检索工具)

关键字搜索是买家查找产品的方式&#xff0c;一个高质量的关键词可以帮助卖家快速增加曝光率。简而言之&#xff0c;利用好关键词机理&#xff0c;能让我们的产品产生更有利的排名因素。 那如何找到合适的关键字&#xff0c;设置关键字时应该注意什么&#xff1f; 今天从产品的…

libcrypto-1_1.dll丢失,要怎么处理?

一般出现这个libcrypto-1_1.dll丢失的问题&#xff0c;我看绝大部分都是出在刺客信条这边的人&#xff0c;很多人吐槽 在运行刺客信条3游戏的时候遇到提示缺少libcef.dll文件的问题。其实遇到这问题还是比较好解决的。 libcrypto-1_1.dll丢失的处理方法 第一种&#xff0c;首…

云存储--1

背景 这一板块主要是讲诉云计算中的存储板块。 那么云存储主要分为三大类&#xff1a;块存储、文件存储、对象存储。 那么&#xff0c;这一章我们来了解一下什么是块存储&#xff0c;以及块存储在云计算当中的使用场景。 1、 什么是块存储&#xff1f; 我们来思考一个场景&a…

Spring Boot集成MyBatis

1.整合Durid数据源 1、引入Jar包 2.application.yml配置 3.读取配置类DruidConfig 总结&#xff1a;其实没有必要一个个手动去配置&#xff0c; druid 启动starter druid 自动配置类 2.整合MyBatis 2.1生成MyBatis代码: pom.xml generatorConfig.xml 运行插件—…

java计算机毕业设计ssm余庆金阳驾校管理系统75wh9(附源码、数据库)

java计算机毕业设计ssm余庆金阳驾校管理系统75wh9&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

看完这篇,轻松编写Markdown

攻城狮为什么要会Markdown Markdown是什么 Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语…