位置: IT常识 - 正文

[vue 进阶] 关于dicts字典的用法(vue相关)

编辑:rootadmin

推荐整理分享[vue 进阶] 关于dicts字典的用法(vue相关),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue-dialog,vuedirective,vue例子详解,vue的dialog,vuedirective,vue dicom,vue例子详解,vue的dialog,内容如对您有帮助,希望把文章链接给更多的朋友!

最近在学习若依系统的框架,其中发现一个很奇怪的事情,网上查询很多地方,也是一知半解。

网上搜索的结果如下,大家可以先看看:

[vue 进阶] 关于dicts字典的用法_小钿钿不忘初心_的博客-CSDN博客前言在使用若依框架开发小项目的时候,发现在项目中频繁使用到字典,原本代码中的dicts没有深入研究,故自己写了一个混入来实现想要的字典获取功能。但是觉得每次切换页面都需要调用一下,而且每个系统都有一个mixins混入文件,感觉维护起来稍显繁琐。继而研究了一下dicts的用法,记录一下使用过程。1.首先确定字典的接口,在若依框架中如下,具体可根据自己后端提供的字典接口进行修改// 根据字典类型查询字典数据信息export function getDicts(dictType) { return rhttps://blog.csdn.net/u013034585/article/details/122185684所以花了一天时间去研究若依中关于dicts的使用。

简单的说就是:

将字典做成了插件,添加到了Vue全局中,然后使用混入技术mixin,将dict的内容混入其中,然后每一个组件就都可以使用,但是我们发现并没有定义dict,很多人会觉得很奇怪。

<el-select v-model="form.sex" placeholder="请选择性别"> <el-option v-for="dict in dict.type.sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" ></el-option></el-select>

这里就是,使用的dict好像没有定义啊???

但是我们发现,有这样的东西。

export default { name: "User", // 使用字典属性 dicts: ['sys_normal_disable', 'sys_user_sex'], components: { Treeselect },}[vue 进阶] 关于dicts字典的用法(vue相关)

是不是很迷糊?下面我们取dict的源码中去找找看?

-------------------------------以下是源码,已经有注释了,大家可以自己看-----------------

将dict相关的属性封装成组件,然后使用插件的形式放入Vue,通过Vue实现全局混入,这样在任何地方就可以使用dict属性使用字典

第一步:字典插件初始化

// 字典数据组件----------->main.jsimport DictData from '@/components/DictData'// 字典组件挂载到Vue上当做插件使用DictData.install()

第二步:字典组件定义

注意,这里vue.use方法的第二个参数是option参数表,这个值是可选项,使用use函数的时候,将会作为参数传递进来,可以搜索use源码:const args = toArray(arguments, 1),这里将参数在赋给字典插件

import Vue from 'vue'import DataDict from '@/utils/dict'import {getDicts as getDicts} from '@/api/system/dict/data'  // 这是查询字典的方法​function install() {​  // 使用vue挂载DataDict插件,这里插件做成了函数形式,不需要install方法,直接use即可  Vue.use(DataDict, {    metas: {      '*': {        labelField: 'dictLabel',        valueField: 'dictValue',        request(dictMeta) {          return getDicts(dictMeta.type).then(res => res.data)       },     },   }, })}​export default {  install,}

第三步:自定义字典函数

这里主要是将自定义内容挂载到vue实例当中去,充分使用mixin技术实现

export default function(Vue, options) {​  // 1. 用插件参数替换默认配置参数  mergeOptions(options)​  // Vue全局混入dict属性  Vue.mixin({    data() {​      // 注意这里this.$options表示vue实例中data以外定义的属性,所以用户需要使用的时候,只需要在实例中加dicts属性列表即可      if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) {        return {}     }​      // 这里将结果返回给了dict对象,所以使用dict对象可以实现数据使用      const dict = new Dict()      dict.owner = this      return {        dict     }   },    created() { // 如果当前组件没有定义属性列表dicts,那么就没有混入dict属性,this.dict就不存在,直接返回,不调用dict.init() if (!(this.dict instanceof Dict)) { return } options.onCreated && options.onCreated(this.dict) // dict的初始化,这里的$options.dicts是当前组件的dicts属性,包含用户自定义属性值列表type // init函数执行完毕,那么所欲的dict数据均加载完毕 this.dict.init(this.$options.dicts).then(() => { // 如果初始化组件的时候,参数中定义onReady函数,那么此时就会调用 options.onReady && options.onReady(this.dict) this.$nextTick(() => { // 触发dictReady事件 this.$emit('dictReady', this.dict) // 调用组件实例中的methods属性,如果其中的onDictReady存在,那么就执行他,并把dict作为参数传递进去,并执行 if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) { this.$options.methods.onDictReady.call(this, this.dict) } }) })},})}

首先,看看mergeOptions(options)函数干了什么

export const options = {  metas: {    '*': {      /**       * 字典请求,方法签名为function(dictMeta: DictMeta): Promise       */      request: (dictMeta) => {        console.log(`load dict ${dictMeta.type}`)        return Promise.resolve([])     },      /**       * 字典响应数据转换器,方法签名为function(response: Object, dictMeta: DictMeta): DictData       */      responseConverter,      labelField: 'label',      valueField: 'value',   }, },  /**   * 默认标签字段   */  DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'],  /**   * 默认值字段   */  DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'],}export function mergeOptions(src) {  // 以递归的形式用src中属性值去替换options中同位置的值,没有的话就使用默认options  mergeRecursive(options, src)}​// 数据合并export function mergeRecursive(source, target) {  for (var p in target) {    try {      if (target[p].constructor == Object) {        source[p] = mergeRecursive(source[p], target[p]);     } else {        source[p] = target[p];     }   } catch (e) {      source[p] = target[p];   } }  return source;}

以上我们可以得出结论,mergeOptions就是将src和options合并,然后返回,其中src有得都会对应给options,src中没有的则默认使用options中的属性,结果如下:

// 1.内置的options参数export const options = {  metas: {    '*': {        request: (dictMeta) => {            console.log(`load dict ${dictMeta.type}`)            return Promise.resolve([])       },        responseConverter,        labelField: 'label',        valueField: 'value',   }, },  DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'],  DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'],}​// 2. 用户自定义插件时传入的参数src = {    metas: {      '*': {        labelField: 'dictLabel',        valueField: 'dictValue',        request(dictMeta) {          return getDicts(dictMeta.type).then(res => res.data)       },     },   }, }​// 3.合并之后的结果{  metas: {    '*': {        request(dictMeta) {          return getDicts(dictMeta.type).then(res => res.data)       },        responseConverter,        labelField: 'dictLabel',        valueField: 'dictValue',   }, },  DEFAULT_LABEL_FIELDS: ['label', 'name', 'title'],  DEFAULT_VALUE_FIELDS: ['value', 'id', 'uid', 'key'],}​​

其中responseConverter是自定义转换函数,如下:

function responseConverter(response, dictMeta) {  const dicts = response.content instanceof Array ? response.content : response  if (dicts === undefined) {    console.warn(`no dict data of "${dictMeta.type}" found in the response`)    return [] }  return dicts.map(d => dictConverter(d, dictMeta))}​export default function(dict, dictMeta) {  const label = determineDictField(dict, dictMeta.labelField, ...DictOptions.DEFAULT_LABEL_FIELDS)  const value = determineDictField(dict, dictMeta.valueField, ...DictOptions.DEFAULT_VALUE_FIELDS)  return new DictData(dict[label], dict[value], dict)}​/** * 确定字典字段 * @param {DictData} dict * @param {...String} fields */function determineDictField(dict, ...fields) {  return fields.find(f => Object.prototype.hasOwnProperty.call(dict, f))}

//=============第一次学着写博文,希望大家多鼓励=====================//

本文链接地址:https://www.jiuchutong.com/zhishi/287175.html 转载请保留说明!

上一篇:鹤望兰的养殖方法(图文)(鹤望兰的养殖方法和注意事项浇水)

下一篇:安装pnpm踩的坑(npp怎么安装)

  • iphone相机怎么拍摄慢动作(iphone相机怎么拍出模糊的照片)

    iphone相机怎么拍摄慢动作(iphone相机怎么拍出模糊的照片)

  • 小米手机怎么自定义水印(小米手机怎么自定义锁屏壁纸)

    小米手机怎么自定义水印(小米手机怎么自定义锁屏壁纸)

  • 拼多多老出现安全验证(拼多多老出现安全模式)

    拼多多老出现安全验证(拼多多老出现安全模式)

  • 表格日期怎么自动递增(表格日期怎么自动增加天数)

    表格日期怎么自动递增(表格日期怎么自动增加天数)

  • flaal10是华为什么型号手机(flaal10是华为什么型号手机能升级鸿蒙)

    flaal10是华为什么型号手机(flaal10是华为什么型号手机能升级鸿蒙)

  • 微商相册如何下单购买(微商相册如何下载图片)

    微商相册如何下单购买(微商相册如何下载图片)

  • 快手拉黑对方同城还能看见吗(快手拉黑后对方)

    快手拉黑对方同城还能看见吗(快手拉黑后对方)

  • 抖音视频消失是什么原因(抖音视频消失是拉黑了吗)

    抖音视频消失是什么原因(抖音视频消失是拉黑了吗)

  • 电脑屏幕清洁(电脑屏幕清洁剂可以擦眼镜片吗)

    电脑屏幕清洁(电脑屏幕清洁剂可以擦眼镜片吗)

  • 悟空问答是什么(悟空问答是干嘛的)

    悟空问答是什么(悟空问答是干嘛的)

  • 手机看电视发烫是怎么回事(手机看电视发烫会爆炸吗)

    手机看电视发烫是怎么回事(手机看电视发烫会爆炸吗)

  • oppo手机右上角有两个箭头(oppo手机右上角的HD怎么关闭)

    oppo手机右上角有两个箭头(oppo手机右上角的HD怎么关闭)

  • 小米8恢复出厂设置在哪里(小米8恢复出厂设置会怎么样)

    小米8恢复出厂设置在哪里(小米8恢复出厂设置会怎么样)

  • qq头像变企鹅怎么恢复(qq头像变企鹅怎么回事)

    qq头像变企鹅怎么恢复(qq头像变企鹅怎么回事)

  • 微信验证码发不出去怎么办(微信验证码发不进去)

    微信验证码发不出去怎么办(微信验证码发不进去)

  • olcd烧屏是什么意思(oled烧屏是什么意思)

    olcd烧屏是什么意思(oled烧屏是什么意思)

  • v1836a是什么手机型号(型号v1832a是什么手机)

    v1836a是什么手机型号(型号v1832a是什么手机)

  • id的全称(id的全称英文是什么)

    id的全称(id的全称英文是什么)

  • win10系统扩大c盘容量(win10电脑如何扩大c盘空间)

    win10系统扩大c盘容量(win10电脑如何扩大c盘空间)

  • vivo手机设置双卡切换(vivo手机设置双卡在哪里)

    vivo手机设置双卡切换(vivo手机设置双卡在哪里)

  • 喵喵机怎么连接手机(喵喵机怎么连接打印机)

    喵喵机怎么连接手机(喵喵机怎么连接打印机)

  • 荣耀手环可以接电话吗(荣耀6手环怎么连接手机)

    荣耀手环可以接电话吗(荣耀6手环怎么连接手机)

  • vue拍摄键没反应(vue按拍摄键没反应)

    vue拍摄键没反应(vue按拍摄键没反应)

  • deskup.exe是什么进程 deskup进程作用是什么(kpupgrader.exe是什么)

    deskup.exe是什么进程 deskup进程作用是什么(kpupgrader.exe是什么)

  • 【HTML】筑基篇(html 教程)

    【HTML】筑基篇(html 教程)

  • 股份公司解散是什么?
  • 简易计税是否要申报个税
  • 采购人员的差旅费计入采购成本吗?
  • 更正申报多交的个税
  • 陈列费属于什么大类
  • 一般纳税人支付给小规模纳税人的税率
  • 专利技术转让使用费如何做会计处理?
  • 冲预付账款预算会计怎么做分录
  • 贷款 保险费
  • 汇算清缴补交的所得税怎么记帐
  • 自收自支事业单位是什么意思
  • 购买银行承兑利息收入是否缴纳增值税?
  • 营业账簿印花税包括什么
  • 会计学堂值得购买吗
  • 研发人员的社保可以加计扣除吗
  • 小规模季报利润表本月金额和本年累计金额
  • 对公账号钱怎么拿出来
  • 增值税暂行条例属于
  • 稽查查补的税款可以享受即征即退吗
  • 餐饮费开专票
  • 公司注销 缴税
  • 红魔3和一加7pro哪个好
  • 城镇土地使用税征收范围
  • 应付工资薪酬期末应该为0吗
  • 收到一张餐饮费发票怎么入账
  • 公司租用员工的车租车协议
  • php清空数据表
  • wifi默认网关是什么
  • PHP:curl_multi_info_read()的用法_cURL函数
  • php实现文件下载功能
  • 交易性金融资产属于什么科目
  • 出售固定资产净收益影响营业利润吗
  • 最贵的苹果平板
  • wordpress如何使用
  • 怎么计算土地增值税金额
  • thinkphp3.1
  • 未达起征点销售额和小微企业免税销售额
  • 期末余额和年初余额为什么不一样
  • 运输中合理损耗计入存货成本吗
  • 难以置信含义
  • windows pythonpath
  • 【历史上的今天】4 月 7 日:IBM System/360 问世;以太网的发明者诞生;第一个 RFC 文档发布
  • vue常用
  • 产权转移数据印花
  • 固定资产计提折旧的方法
  • 弥补以前年度亏损最多几年
  • 小规模纳税人附加税会计分录
  • wordpress woocommerce 建站
  • 发票已认证未抵扣,开红字发票信息表后,愿票需要退回吗
  • 一般纳税人和小规模纳税人怎么界定
  • 第四季度报表和年报对不上
  • 应交税费需要结转到本年利润吗
  • 工会经费的主要用途
  • 什么是企业会计确认计量和报告的空间范围
  • 银行转账支付中是什么状态
  • 企业收到国债专项资金怎么记账
  • 明细账怎么补登
  • 资产负债表里的固定资产是原值还是净值
  • 起征点与免征额的联系
  • 涉税信息声明怎么提供
  • 子公司如何向母公司开户
  • macbookair网页全屏
  • linux中使用最多的命令
  • hptlbxfx.exe
  • linux系统服务器怎么进入桌面
  • linux安装与基本命令
  • 简单理解贴现
  • android 多个activity
  • excel自定义样式
  • jQuery 判断JSON
  • Linuxshell脚本实现自动化软件部署内容
  • JavaScript Length 属性的总结
  • js new()
  • java 信号量 超时
  • 云南省税务局app缴费
  • 可以跨区办理税务ukey更换吗
  • 陕西省国家税务局
  • ca登陆
  • 浙江省个体工商户税收政策
  • 电子税务局怎么删除办税员
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设