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

这篇具有很好参考价值的文章主要介绍了[vue 进阶] 关于dicts字典的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

[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 },
}

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

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

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

第一步:字典插件初始化

// 字典数据组件----------->main.js
import 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.toymoban.com/news/detail-790751.html

到了这里,关于[vue 进阶] 关于dicts字典的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Python的数据类型——字典(dict)

    目录 1. Python的数据类型 2. 什么是字典 3. 字典存储的数据 4. 字典的语法  5. 新建字典 (1) 用{ }新建一个空字典

    2024年02月06日
    浏览(8)
  • 【Python】Python dict (字典)详解

    【Python】Python dict (字典)详解

    Python 字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们的元素在底层是挨着存放的。 字典类型是 Python 中唯一的映射类型。“映射”是数学中的术语,简单理解,它指的是元素

    2024年03月17日
    浏览(10)
  • python中Dict 字典类型(键值对)

    字典也是用于存储一组或者多组数据时使用 字典是 键值对 的存储方式 name : admin 键和值之间使用 冒号分隔 键必须是字符串或者数字类型,键可以是任意类型 键名不能重复,值可以重复 比如需要记录一本树相关数据 书名,作者,价格… vard = [{‘title’:’鬼谷子’,‘author’:‘鬼

    2023年04月09日
    浏览(14)
  • 【python入门篇——12】字典(dict)详解

    【python入门篇——12】字典(dict)详解

    字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用\\\"键\\\" (key) 进行索引,而不像序列可以用下标进行索引 字典中的数据没有先后关系,字典的存储是无序的 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。key必须是不可变类型,

    2024年02月07日
    浏览(24)
  • 【python入门篇——11】字典(dict)详解

    【python入门篇——11】字典(dict)详解

    字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用\\\"键\\\" (key) 进行索引,而不像序列可以用下标进行索引 字典中的数据没有先后关系,字典的存储是无序的 字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。key必须是不可变类型,

    2024年02月09日
    浏览(11)
  • Python中dict字典的多种遍历方式

    可以使用 for key in dict 遍历字典中所有的键 字典提供了 keys () 方法返回字典中所有的键 字典提供了 values () 方法返回字典中所有的值 字典提供了 items () 方法返回字典中所有的键值对 item 键值对 item 是一个元组(第 0 项是键、第 1 项是值) 例子

    2024年02月08日
    浏览(10)
  • Python之字典(dict)基础知识点

    Python之字典(dict)基础知识点

    字典是python当中的一种数据类型,其结果跟之前学过的列表、元组有很大区别,字典内部是一个一对一映射的数据关系。 字典语法: dictionary = {key1:value1, key2:value2, ...} key是字典中的键,value是对应的值 字典必须用大括号{},key与对应的value用“:”连接,中间用“,”断开。

    2024年02月13日
    浏览(10)
  • Python 将字典(dict)转换为DataFrame

    1.将字典转换为 Pandas DataFame 的方法 Pandas 的 DataFrame 构造函数pd.DataFrame()如果将字典的 items 作为构造函数的参数而不是字典本身,则将字典转换为 dataframe。 字典的键和值将转换为DataFrame的两列,其列名如选项列中所给。 输出为: 2.在 Pandas DataFrame 中将键转换为列,将值转换

    2024年02月13日
    浏览(11)
  • Pytho 从列表中创建字典 (dict.fromkeys()的问题)

    问题起因:想在代码中通过已有的列表创建一个字典,但是又不想写循环,更不想手动填,所以用到了字典对象的 fromkeys() 方法 。 先以一个简单的例子介绍一下该方法: 如果我们的代码中也是这种简单的情况,那就没有接下来的问题了,But,不是。 在我的代码中,假设我想

    2024年02月09日
    浏览(5)
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件

    一 读取excel内容、并放入字典 1 读取excel文件 2 读取value,舍弃行号 3 读取为字典 一 读取excel内容、并放入字典(完整代码) 二、将字典内容写入 excel文件 1 假设已有字典内容为: 即student列表里有4个字典, 第一个字典里面有3对key-value \\\"num\\\": 1, \\\"name\\\": \\\"cod1\\\", \\\"wfm\\\": 0.1 2 导入Workb

    2024年02月04日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包