基于element-plus的Dialog选择控件

翻看之前工程师写的vue2的代码,很多都是复制、粘贴,也真是搞不懂,明明可以写一个控件,不就可以重复使用。很多前端总喜欢element搞一下,ant-design也搞一下,有啥意义,控件也不是自己写的,积木也没有搭好。
1
选中之后将值带回去
1
先看看组件代码

<template>
    <el-input v-model="inputLabel" @click="showSub">
        <template #suffix>
            <i class="iconfont iconicon2-081"></i>
        </template>
    </el-input>

    <BaseDialog ref="dialog" title="选择会计科目" width="470px" :visible='visible' :showClose="true" 
        @beforeClose="visible=false">
        <el-tabs v-model="subjectName" >
            <el-tab-pane v-for="(item,index) in subjectTabs" :key="index" :name='item.name' :label="item.title" :value="index" class="tabPane">
            <el-tree :data="categoryTree[index]" node-key="id" default-expand-all highlight-current :expand-on-click-node='false' @node-click="handleSubjectClick" :props="defaultSubjecTreeProps"
            style="height: 380px;overflow-y: auto;">
                <template #default="{ node,data }">
                    <span class="custom-tree-node">
                        <i :class="data.children.length>0 ? 'iconfont iconicon2-08' : 'iconfont iconicon2-11' "></i>
                        {{ node.label }}
                    </span>
                </template>
            </el-tree>
            </el-tab-pane>
        </el-tabs>
        <template #footer>
            <div  class="dialog-footer">
                <el-button type="primary" @click="cancelDialog">返 回</el-button>
            </div>
        </template>
    </BaseDialog>
</template>
<script lang="ts" setup>
import {ref,getCurrentInstance,computed,onMounted,watch } from 'vue'
import BaseDialog from '@/components/base/BaseDialog.vue';
import { useAppStore } from '@/store'
import { de } from 'element-plus/es/locale';
const { proxy }: any = getCurrentInstance();
const appStore = useAppStore()
const userInfo = computed(() => appStore.userInfo)
const curAccountSet = computed(() => appStore.curAccountSet)
const defaultSubjecTreeProps = ref({children: 'children',label: 'label'})
const inputProps = ref({label:'name',value:'id'})
const inputLabel = ref('')
const emits = defineEmits(['update:modelValue','change'])
const visible = ref(false)
const props = defineProps<{
    modelValue:{},
}>()
const showSub = () =>{
    visible.value = true;
}
const subjectName = ref(1)
const subjectTabs = ref(curAccountSet.value?.accountingStandard=='1'?[
    {title: "资产", name: 1,},
    {title: "负债", name: 2,},
    {title: "权益", name: 3,},
    {title: "成本", name: 4,},
    {title: "损益", name: 5,},
]:[
    {title: "资产", name: 1,},
    {title: "负债", name: 2,},
    {title: "共同", name: 3,},
    {title: "权益", name: 4,},
    {title: "成本", name: 5,},
    {title: "损益", name: 6,},
])
const categoryTree = ref([])
const getCategoryTree = async (cate) =>{
    const res = await proxy.$api.acc.accountsubject.list({asId:curAccountSet.value.accId,category:cate});
    if (res.success){
        categoryTree.value[cate - 1] = res.data;
    } else{
        proxy.$message.error(res.msg);
    }
}
const handleSubjectClick = (data) => {
    if (proxy.$_.isEmpty(data.children)){
        inputLabel.value = data.name
        emits('update:modelValue',{value:data.id,label:data.name})
        visible.value = false
    }
}
const cancelDialog = () =>{
    visible.value = false;
}
watch(()=>props.modelValue,(newVal,oldVal)=>{
    if (!proxy.$_.isEmpty(newVal)){
        inputLabel.value = newVal['label']
    }
},{immediate:true,deep:true})
onMounted(()=>{
    getCategoryTree(1);
    getCategoryTree(2);
    getCategoryTree(3);
    getCategoryTree(4);
    getCategoryTree(5);
})
</script>

控件使用比较简单了

<el-form-item label="应付账款" prop="yfzk">
                            <acc-account-subject v-model="orderForm.yfzk"></acc-account-subject>
                        </el-form-item>

但是在保存和加载的时候需要特殊处理,因为控件的值是{value:data.id,label:data.name}
保存之前,需要做一次深拷贝,不能直接修改orderForm.value,因为双向绑定,页面的数据会改变。

const convertParams = () =>{
    debugger
    let params = proxy.$tool.deepClone({...orderForm.value})
    // 应收账款
    params['yszk'] = orderForm.value['yszk']?.value || ''
    params['yszkName'] = orderForm.value['yszk']?.label || ''
  
    return params;
}
const save = async () => {
    orderRef.value?.validate(async valid=>{
        if (valid){
            isLoading.value = true
            const params = convertParams()
            const res = await proxy.$api.setting.psiAccConfig.save(params)
            if (res.success){
                isLoading.value = false;
                proxy.$message.success(res.msg);
            } else{
                isLoading.value = false;
                proxy.$message.error(res.msg);
            }
        }
    })
}

页面加载的时候也需要做一下处理,还是因为数据结构的缘故

const load = async () => {
    const res = await proxy.$api.setting.psiAccConfig.load({asId:userInfo.value.currentAsId})
    if (res.success){
        isLoading.value = false;
        orderForm.value = res.data;
        // 应收张狂
        if (orderForm.value['yszkName']){
            orderForm.value['yszk'] = {label:orderForm.value['yszkName'],value:orderForm.value['yszk']}
        }
        }
    } else{
        isLoading.value = false;
        proxy.$message.error(res.msg);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

45、C++/基础练习20240311

一、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求 使用C风格字符串完成。 代码&#xff1a; #include <iostream>using namespace std;int main() {string buf;//定义字符串类型变量bufcout << &…

在Jetson Xavier NX 开发板上使用VScode执行ROS程序详细过程

1.创建 ROS 工作空间ws 在home下打开终端输入下面指令 mkdir -p xxx_ws/src(必须得有 src) cd 自己命名_ws catkin_make2.启动 vscode cd 自己命名_ws code .3.vscode 中编译 ros 快捷键 ctrl shift B 调用编译&#xff0c;在上方弹窗位置选择:catkin_make:build 可以点击…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段&#xff0c;那应该是sql注入&#xff0c;先试试 试了一些发现会被检查到&#xff0c;随便传数字 除了1和2有返回结果&#xff0c;其余的都报错&#xff0c;应该是数字型注入&#xff0c;抓包看看过滤了哪些 这个…

C语言实现贪吃蛇

前言&#xff1a;今天给大家详细介绍一下小游戏贪吃蛇的代码。 目录 一 .贪吃蛇实现的功能 二.贪吃蛇游戏设计与分析 1.贪吃蛇以及贪吃蛇所需要维护的数据 &#xff08;1&#xff09;贪吃蛇蛇体 &#xff08;2&#xff09;数据维护 2.地图设计 &#xff08;1&#x…

详解7道经典指针运算笔试题!

目录 ​编辑 1. 题目一 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 2. 题目二 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 3. 题目三 &#xff08;1&#xff09;代码 &#xff08;2&#xff09;分析 4. 题目四 &#xff08;…

鸿蒙开发为什么这么火,现在入行鸿蒙是否来的及?

鸿蒙开发是当前备受关注的技术领域之一&#xff0c;对于想要入门学习鸿蒙开发的初学者来说&#xff0c;需要掌握一定的基础知识和技能。鸿蒙开发又是否能为程序员们带来一片光明的未来呢&#xff1f;让我们一同探讨这些问题。 对于初学者来说&#xff0c;鸿蒙开发是否易于上手呢…

构建空间场景轻应用,Mapmost Alpha来啦【文末赠书(10本)--第一期】

文章目录&#xff1a; 一、Mapmost Alpha 介绍二、Mapmost Alpha应对数字孪生业务痛点解决之道2.1 Mapmost Alpha 提供海量城市底板2.2 Mapmost Alpha 提供便捷的配置管理工具2.3 Mapmost Alpha 提供一键式部署发布和分享 三、沉浸式体验Mapmost Alpha3.1 创建应用3.2 新手指导…

树莓派安装Nginx服务搭建web网站结合内网穿透实现公网访问本地站点

文章目录 1. Nginx安装2. 安装cpolar3.配置域名访问Nginx4. 固定域名访问5. 配置静态站点 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务器&#xff0c;Ngi…

Everything:文件查找工具,一搜即得

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍①Everything②核心功能③原理 二、下载安装①下载②安装 三、使用方法①文…

如何利用音频转换器将多个MP3音频转换为OGG格式

现在&#xff0c;我们接触到的很多音频文件一般都是MP3格式的。但是我们偶尔也需要用到ogg格式的音频文件&#xff0c;所以就需要我们将MP3格式音频文件转换为ogg格式了&#xff0c;那么&#xff0c;如果想要将MP3格式文件转换为OGG格式该如何操作呢&#xff1f;相信很多朋友心…

Linux内核之报错-Werror,-Wunused-variable等通用解决方案(二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

企业数据备份体系化方法论的七大原则之二:区分环境数据与业务数据

在之前讨论的分布式存储系统七大原则的第一原则中&#xff0c;我们了解了容灾切换和数据备份的差异。现在&#xff0c;我们继续探索第二原则&#xff1a;区分环境数据与业务数据。这一原则强调了两种类型数据在变化频率、价值以及数据一致性获取难度方面的根本区别&#xff0c;…

Python中starmap有什么用的?

目录 前言 starmap函数的作用 starmap函数的用法 starmap函数的示例 1. 对每个元组元素进行求和 2. 对每个元组元素进行乘积 实际应用场景 1. 批量处理函数参数 2. 并行处理任务 3. 批量更新数据库 总结 前言 在Python中&#xff0c; starmap 是一个非常有用的函数&…

Vue3 + antv/x6 实现流程图

新建流程图 // AddDag.vue <template><div class"content-main"><div class"tool-container"><div click"undo" class"command" title"后退"><Icon icon"ant-design:undo-outlined" /…

用信号的方式回收僵尸进程

当子进程退出后&#xff0c;会给父进程发送一个17号SIGCHLD信号&#xff0c;父进程接收到17号信号后&#xff0c;进入信号处理函数调用waitpid函数回收僵尸进程若多个子进程同时退出后&#xff0c;这是切回到父进程&#xff0c;此时父进程只会处理一个17号信号&#xff0c;其他…

pycharm手动安装常用插件

下载插件 &#xff08;1&#xff09;下载地址&#xff1a;JetBrains Marketplace 这里以语言包为例子 2、中文语言包 进入pycharm中的设置&#xff0c;点击plugins,选从磁盘中安装插件

2024.3.11 训练记录(13)

继续补题 文章目录 ICPC 2018青岛I Soldier GameICPC 2018青岛K Airdrop ICPC 2018青岛I Soldier Game 题目链接 线段树 果然稍微复杂一点的线段树就很难实现啊&#xff0c;不看题解根本没反应过来是线段树 struct Node {int l, r, lb, rb, nb, b; } tr[N * 4];其中&#x…

帮管客 CRM jiliyu SQL注入漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统,客户管理,从未如此简单,一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传统,重新定义企业管理系统。 …

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的&#xff0c;比如轻量服务器不支持更换内网IP地址&#xff0c;不支持自定义私有网络VPC&#xff0c;内网连通性方面也有限制&#xff0c;轻量不支持CPU内存、带宽或系统盘单独升级&#xff0c;只能整个套餐整体升级&#x…

使用Git拉取代码时候出现error file write error no space left on device问题如何解决

1. 检查磁盘空间 首先&#xff0c;确认是哪个分区或驱动器满了。你可以使用以下命令来查看各分区的使用情况&#xff1a; 对于 Linux 或 macOS&#xff1a; df -h对于 Windows&#xff0c;你可以在“我的电脑”中查看各驱动器的剩余空间&#xff0c;或者在命令提示符&#x…