【vue3】获取字典数据,封装为公共方法

这篇具有很好参考价值的文章主要介绍了【vue3】获取字典数据,封装为公共方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

后台项目中基本上都有字典管理页面,Vue封装字典数据的主要目的是为了方便数据的管理和使用

不管在哪个页面使用下拉框,el-select的options数据源需要通过调用接口获取到,不同的数据源调用不同的接口,引入和使用都是不小的工作量,如果使用字典数据管理,不管同个页面需要多少数据源,一个方法即可搞定,岂不高效多了。

字典页面的结构代码不贴了,大体如截图所示
【vue3】获取字典数据,封装为公共方法,vue.js,javascript,前端
左边列表是字典名称,右边列表是字典名称对应的字典标签等数据

1、使用pinia存取数据

使用Pinia在Vue项目中存取字典数据可以提供更好的状态管理和数据共享机制,简化了组件逻辑和渲染过程,同时提供了类型安全和代码提示,拓展了插件和工具支持。这些优势使得代码更加清晰简洁、易于维护

pinia使用模块化的方式将状态分为不同的模块,这种分模块的方式可以提供更好的组织和管理,使状态的结构更清晰和可扩展

store文件夹下新建index.js,和dict.js,
【vue3】获取字典数据,封装为公共方法,vue.js,javascript,前端
index.js

const store = createPinia()

export default store

**

pinia中定义了使用defineStore函数创建一个独立的store小仓库

defineStore函数接收两个参数,
1、storeName(必需):一个字段串,用于定义store的名称

2、storeOptions(可选):一个对象,包含用于定义store的配置选项

**
modules–dict.js

const  useDictStore = defineStore('dict',{
state:()=>({
dict:new Array()
}),
actions:{
 // 获取字典
      getDict(_key) {
        if (_key == null && _key == "") {
          return null;
        }
        try {
          for (let i = 0; i < this.dict.length; i++) {
            if (this.dict[i].key == _key) {
              return this.dict[i].value;
            }
          }
        } catch (e) {
          return null;
        }
      },
      // 设置字典
      setDict(_key, value) {
        if (_key !== null && _key !== "") {
          this.dict.push({
            key: _key,
            value: value
          });
        }
      },
      // 删除字典
      removeDict(_key) {
        var bln = false;
        try {
          for (let i = 0; i < this.dict.length; i++) {
            if (this.dict[i].key == _key) {
              this.dict.splice(i, 1);
              return true;
            }
          }
        } catch (e) {
          bln = false;
        }
        return bln;
      },
      // 清空字典
      cleanDict() {
        this.dict = new Array();
      },
}
})

2、在utils文件夹下新建dict.js

1、…args是一个形参,表示接收一个不定数量的参数,并将这些参数作为一个数组存储在args变量中。
在函数调用时,可以传入任意数量的参数,这些参数会被收集到args数组中。例如,如果函数调用为useDict(‘type1’, ‘type2’, ‘type3’),那么args数组将包含[‘type1’, ‘type2’, ‘type3’]这些元素。
2、创建一个ref对象res,用于保存字典数据
3、调用useDictStore().getDict(dictType)来尝试获取字典数据
4、如果成功获取到字典数据,则将其赋值给res.value[dictType]
5、如果未获取到字典数据,则使用getDicts(dictType)异步获取字典数据
6、当异步获取字典数据成功返回后,将返回的数据进行转换,并将转换后的字典数据赋值给res.value[dictType]
7、最后,通过useDictStore().setDict(dictType, res.value[dictType])将字典数据保存到字典存储中
文章来源地址https://www.toymoban.com/news/detail-611042.html

import useDictStore from '@/store/modules/dict'
// 根据字典类型查询字典数据信息
import { getDicts } from '@/api/system/dict/data'

/**
 * 获取字典数据
 */
export function useDict(...args) {
  const res = ref({});
  return (() => {
    args.forEach((dictType, index) => {
      res.value[dictType] = [];
      //dictType字典名称
      const dicts = useDictStore().getDict(dictType);
      //如果dicts有值,说明仓库中已经存储,直接使用
      if (dicts) {
        res.value[dictType] = dicts;
      } else {
      //如果无值,代表仓库中还未存储,调用获取字典标签的接口,参数dictType代表要查询的字典名称
        getDicts(dictType).then(resp => {
          res.value[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: p.dictValue, elTagType: p.listClass, elTagClass: p.cssClass }))
          useDictStore().setDict(dictType, res.value[dictType]);
        })
      }
    })
    return toRefs(res.value);
  })()
}

3、在main.js中全局引入useDict方法

import { useDict } from '@/utils/dict'
// 全局方法挂载
app.config.globalProperties.useDict = useDict

4、在vue页面中使用

<template>
   <div class="app-container">
      <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
       <el-form-item label="任务组名" prop="jobGroup">
            <el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名"
             clearable    style="width: 200px">
               <el-option
                  v-for="dict in sys_job_group"
                  :key="dict.value"
                  :label="dict.label"
                  :value="dict.value"
               />
            </el-select>
         </el-form-item>
     </el-form>
        </div>
</template>
<script setup name="Job">
//getCurrentInstance()获取当前组件实例的方法
//proxy用于访问当前组件实例属性和方法的代理对象
const { proxy } = getCurrentInstance();
const { sys_job_group, sys_job_status } = proxy.useDict("sys_job_group", "sys_job_status")
</script>

到了这里,关于【vue3】获取字典数据,封装为公共方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • vue3+ts 提取公共方法

    因为好多页面都会使用到这个效验规则,封装一个校检规则,方便维护 封装前 封装后

    2024年02月06日
    浏览(47)
  • js/javascript获取时间戳的5种方法

    以下便是干货 1.获取时间戳精确到秒,13位 2.获取时间戳精确到毫秒,13位 3.获取时间戳精确到毫秒,13位 4.获取时间戳精确到毫秒,13位 5.获取时间戳精确到毫秒,13位 其它 在开发的中需要精确到秒的时候,推荐使用 第1种方法,也需要除以1000才行,如果是需要时间戳毫秒的推荐 +new D

    2024年02月11日
    浏览(42)
  • axios 实战进阶练习( axios 封装篇)——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台的 axios 封装实战

    在之前的文章 axios 实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 中,我们完成了这个 基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台 的项目,其中项目的后端接口是用 Node.js 编写的,通过 axios 来获取接口,所以这篇文章我们来对这个 axi

    2024年02月11日
    浏览(97)
  • Vue3通过JS修改Css样式(附节点获取相关知识)

    方法一:通过获取节点style(获取标签节点) 方法二:通过动态设置class 方法三:直接动态设置style  附节点获取相关知识

    2024年02月16日
    浏览(42)
  • javaScript与vue获取元素的方法

    目录 javaScript 1 根据ID获取 2 根据标签名获取 3 通过HTML5新增的方法获取 vue获取元素及兄弟元素,父级元素 get 获得 element 元素 by 通过 返回的是一个元素对象 document.getElementById(\\\'ID\\\'); get 获得 element 元素 by 通过 Tag标签 Name名字 返回带有指定标签名的对象的集合 以伪数组的形式

    2024年02月08日
    浏览(41)
  • Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑

    1.需求:   在H5 中需要封装一个自定义的tabbar 菜单跳转 通过nut-ui 进行二次封装 2. 注意点   H5 中原生的tabbar 在ios 中会出现问题 所以进行 封装tabbar 3. 代码操作 首先全部的代码  4.解析 tabList: 菜单的内容数组  根据自己菜单的数量 来决定 const tabList = reactivemenu[]([     {    

    2024年04月17日
    浏览(50)
  • uniapp 微信小程序 封装公共的请求js(api版本)

    一、新建api文件夹 在项目目录下创建api文件夹,内放files跟index.js文件夹,files文件夹内放每个页面对应的js请求接口 1、index.js 2、例如:login.js 二、config.js 三、main.js 四、页面使用

    2024年02月14日
    浏览(47)
  • vue3+ts+vite中封装axios,使用方法从0到1

    http.ts文件内容: methods.ts文件内容: api/user.ts 用户相关接口 types/user.d.ts定义接口ts类型 请求成功测试

    2024年02月02日
    浏览(52)
  • Vue组件化开发--公共组件的封装

    目录 为什么要封装组件 应用场景 vue自己封装组件(局部、全局)  Vue组件的三要素 ①全局组件 1)方式:  2)示例: ②局部组件 1)方式: 2)示例: 命名规范:(注意) 脚手架vue-cli中的组件 父传子(props) 通过 $on 传递父组件方法 $parent获取父组件然后使用父组件中的

    2024年02月05日
    浏览(57)
  • vue3创建项目报错Vue.js - The Progressive JavaScript Framework TypeError: (0 , import_node_ut

    报错信息: Vue.js - The Progressive JavaScript Framework TypeError: (0 , import_node_util.parseArgs) is not a function     at init (C:UsersAdministratorAppDataLocalnpm-cache_npx2f7e7bff16d1c534node_modulescreate-vueoutfile.cjs:4481:72)     at Object.anonymous (C:UsersAdministratorAppDataLocalnpm-cache_npx2f7e7bff16d1c534node_module

    2024年04月10日
    浏览(148)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包