vue 表单form-item模板(编辑,查看,新建)

news2024/11/17 3:54:48

目录

formatFormData

后端数据格式​编辑

JSON解析和生成

加载(请求前,await后) 

formComp


formatFormData

后端数据格式

为空的,可以直接不提交/提交null/undefined 

JSON解析和生成

var str = '{"name": "参宿","id":7}';      //'JSON字符串'
var obj = JSON.parse(str);                //JSON.parse(str)
console.log(obj);                       //JSON的解析(JSON字符串转换为JS对象)
//Object { name: "参宿", id: 7 }
var jsonstr = JSON.stringify(obj);        //JSON.stringify(obj)
console.log(jsonstr);                     //JSON的生成(JS对象转换为JSON字符串)
 
JSON.parse(text[, reviver])//reviver函数参数,修改解析生成的原始值,调用时机在 parse 函数返回之前。
//k:key,v:value
JSON.parse('{"p": 5}', function (k, v) {
    if(k === '') return v;     // 如果到了最顶层,则直接返回属性值,
    return v * 2;              // 否则将属性值变为原来的 2 倍。
});                            // { p: 10 }
 
//从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身
JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {
    console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
                    // 最后一个属性名会是个空字符串。
    return v;       // 返回原始属性值,相当于没有传递 reviver 参数。
});
 
// 1
// 2
// 4
// 6
// 5
// 3
// ""

加载(请求前,await后) 

 <mds-loading :isLoading="detailLoading" type="ball-pulse" loadingText="正在努力加载中" />
...
export default class extends Vue {
  detailLoading: boolean = false

//查看
  getQuery() {
    this.detailLoading = true
    API.getQuery(this.$route.params.releId).then((res: any) => {
      if (res && res.code == 200) {
      }
    }).catch((e: any) => {
      this.$message.error(e && e.msg)
    }).finally(() => {
      this.detailLoading = false
    })
  }

//编辑
  getQuery1() {
    API.getQuery1(this.$route.params.releId).then(async (res: any) => {
      if (res && res.code == 200) {

        const indexContent = JSON.parse(res.data.indexContent)
        
        indexContent.index.forEach((item: any) => {
          item.open = true
          item.taskIndex = {
            id: item.taskIndexCode,
            indexNm: item.taskIndexName
          }
        })

        this.formData.indexContent = indexContent
        await this.baseIndexQuaryScoreIndex(this.formData.applyType === 1 ? 'oa' : 'team')
        this.detailLoading = false
      }
    })
  }
}

formComp

<template>
    <mds-form :model="formData" :rules="rules" ref="formData">
        <mds-form-item label="确认方式" prop="confmMode" :required="true">
            <mds-select v-model="formData.confmMode" style="width: 480px" placeholder="请选择" :disabled="disabled" clearable
                filterable>
                <mds-option v-for="item in CONFM_MODE" :value="item.id" :label="item.label" />
            </mds-select>
        </mds-form-item>
        <mds-form-item label="确认周期" prop="confmCycle" :required="true">
            <mds-select v-model="formData.confmCycle" style="width: 480px" placeholder="请选择" :disabled="disabled" clearable
                filterable>
                <mds-option v-for="item in CONFM_CYCLE" :value="item.id" :label="item.label" />
            </mds-select>
        </mds-form-item>
        <mds-form-item label="可确认时间" prop="confmTm" :required="true" class="confmTm-form-item">
            <mds-select :class="{ 'validate-success': formData.confmTm }" v-model="formData.confmTm" style="width: 230px"
                placeholder="请选择" :disabled="disabled" clearable filterable>
                <mds-option v-for="item in CONFM_TM" :value="item.id" :label="item.label" :disabled="isDisabledTm(item)" />
            </mds-select>
            <mds-select :class="{ 'validate-success': (formData.confmTmRange[0] > 0) }" v-model="formData.confmTmRange[0]"
                style="width: 105px" placeholder="开始日期" :disabled="disabled" clearable no-match-text='暂无日期' filterable>
                <mds-option v-for="item in CONFM_TM_RANGE" :value="item" :label="item + '号'"
                    :disabled="isDisabledStart(item)" />
            </mds-select>至
            <mds-select :class="{ 'validate-success': (formData.confmTmRange[1] > 0) }" v-model="formData.confmTmRange[1]"
                style="width: 105px" placeholder="结束日期" :disabled="disabled" clearable no-match-text='暂无日期' filterable>
                <mds-option v-for="item in CONFM_TM_RANGE" :value="item" :label="item + '号'"
                    :disabled="isDisabledEnd(item)" />
            </mds-select>
        </mds-form-item>
        <mds-form-item label="提醒频率" prop="remindFrequency" :required="true">
            <mds-select v-model="formData.remindFrequency" style="width: 480px" placeholder="请选择" :disabled="disabled"
                clearable filterable>
                <mds-option v-for="item in REMINDE_FREQUENCY" :value="item.id" :label="item.label" />
            </mds-select>
        </mds-form-item>
    </mds-form>
</template>
  
<script lang="ts">
import { Component, Vue, Prop, Watch } from 'vue-property-decorator'
import { CONFM_MODE, CONFM_CYCLE, CONFM_TM, REMINDE_FREQUENCY, CONFM_TM_RANGE } from '@/utils/formComp'
@Component({
    components: {}
})

export default class formComp extends Vue {
    @Prop({ required: true }) private disabled!: boolean

    data() {
        return {
            CONFM_MODE: CONFM_MODE,
            CONFM_CYCLE: CONFM_CYCLE,
            CONFM_TM: CONFM_TM,
            REMINDE_FREQUENCY: REMINDE_FREQUENCY,
            CONFM_TM_RANGE: CONFM_TM_RANGE,
            pickerOptions: {
                disabledDate(confmTm: Date) {
                    return confmTm.getTime() < Date.now()
                }
            },
            formData: {
                confmMode: 1,
                confmCycle: "",
                confmTm: "",
                remindFrequency: "",
                confmTmRange: []
            }
        }
    }
    //单向绑定数据,主数据改变,则子数据清空
    @Watch('formData.confmCycle')
    handleChangeConfmCycle(newV: any, oldV: any) {
        if(newV!=oldV){
            this.formData.confmTm=""
        }
    }
    rules = {
        confmMode: [{ required: true, message: '请选择确认方式', trigger: ['blur', 'change'] }],
        confmCycle: [{ required: true, message: '请选择确认周期', trigger: 'change' }],
        confmTm: [{ required: true, validator: this.confmTmValidator, trigger: ['blur', 'change'] }],
        remindFrequency: [{ required: true, message: '请选择提醒频率', trigger: ['blur', 'change'] }],
    }
    //同一个提示位置
    confmTmValidator(rule: any, value: any, callback: any) {
        if (!value || value.length === 0) {
            callback(new Error('请选择可确认时间'))
            //从未选过||选完又取消时会存在值
        } else if (this.formData.confmTmRange.length < 2 || this.formData.confmTmRange[1] <= 0 || this.formData.confmTmRange[0] <= 0) {
            callback(new Error('请选择可确认时间范围'))
        } else {
            callback()
        }
    }
    submit() {
        var isValid;
        //判断表单数据是否有效
        this.$refs.formData.validate((valid: any) => {
            isValid = valid;
        })
        return isValid;
    }
    //双向绑定数据
    isDisabledStart(item: number) {
        //选完又取消
        return this.formData.confmTmRange[1] > 0 && item > this.formData.confmTmRange[1];
    }
    isDisabledEnd(item: number) {
        return this.formData.confmTmRange[0] > 0 && item < this.formData.confmTmRange[0];
    }
    //单向绑定数据
    isDisabledTm(item: { id: number, label: string }) {
        if (this.formData.confmCycle === 3 && item.id != 2) return true;
    }
}

</script>

<style lang="scss" scoped>
::v-deep .mds-form-item-content {
    width: 480px;
    display: flex;
    justify-content: space-between;
    flex-wrap: nowrap;
}

::v-deep .validate-success .mds-input {
    border-color: #d8dce6 !important;
}
</style>

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

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

相关文章

ERROR: No matching distribution found for wxpyhton

ERROR: No matching distribution found for wxpyhton pip install 库包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.compip install wxpython -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

Voicebox:文本引导的大规模多语言通用语音生成

说白了就是录一段你的声音&#xff0c;在最短的时间内学会你说话&#xff01; Meta AI研究团队模型&#xff0c;Voicebox是一个文本转语音的工具&#xff0c;具有多种功能和应用。根据提供的搜索结果&#xff0c;以下是Voicebox的一些功能和特点&#xff1a; 多语言支持&…

语义分割、转置卷积、风格迁移(第十二次组会)

TOC 语义分割 图像分割、实例分割 上采样、下采样 转置卷积 全卷积网络 风格迁移

操作系统_进程与线程(四)

目录 4. 死锁 4.1 死锁的概念 4.1.1 死锁的定义 4.1.2 死锁产生的原因 4.1.3 死锁的处理策略 4.2 死锁预防 4.3 死锁避免 4.3.1 系统安全状态 4.3.2 银行家算法 4.3.2.1 数据结构描述 4.3.2.2 银行家算法描述 4.3.2.3 安全性算法 4.3.3 安全性算法举例 4.3.4 银行…

【EI/SCOPUS会议征稿】第三届物联网与机器学习国际学术会议(IoTML 2023)

第三届物联网与机器学习国际学术会议&#xff08;IoTML 2023&#xff09; 2023 3rd International Conference on Internet of Things and Machine Learning 2023年物联网与机器学习国际学术会议&#xff08;IoTML 2023&#xff09;将于2023年9月15-17日在新加坡召开。会议…

安装华为模拟器

安装前需要安装虚拟机 虚拟机安装 下一步 立即安装 安装驱动 完成 一路下一步 安装完成后拖动一个2240启动

【Liux下6818开发板(ARM)】实现简易相册

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Linux NameSpace 虚拟化 资源隔离

NameSpace NameSpace介绍 在操作系统中命名空间命名空间提供的是系统资源的隔离&#xff0c;其中系统资源包括了&#xff1a;进程、网络、文件系统等等 实际上linux系统实现命名空间主要目的之一就是为了实现轻量级虚拟化服务&#xff0c;也就是我们说的容器&#xff0c;在同…

分享一个赛车动画

先看效果&#xff08;动画太大了放不上来&#xff0c;甘心去复制代码运行即可&#xff09;&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>赛车</title><…

AD21 PCB设计的高级应用(六)极坐标的应用

&#xff08;六&#xff09;极坐标的应用 在 PCB 设计过程中,特别是 LED圆形灯板的 PCB 设计,需要对 LED灯珠进行圆形等间距排列,如果每个元件都计算清楚其坐标再进行放置会非常烦琐。要实现如图 所示的元件布局效果,在 Altium Designer 软件里可以使用极坐标的方法。 (1)打开…

Vue2 第十一节 Vue的生命周期

1.生命周期的概念 2.生命周期流程图 3.生命周期分析 一.生命周期概念 生命周期又称为生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子是Vue在关键时刻帮我们调用的一些特殊名称的函数生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根…

【低代码开发】:加速应用开发的未来趋势

低代码开发&#xff1a;加速应用开发的未来趋势 引言什么是低代码以及功能特点&#xff1f;什么是低代码开发&#xff1f;低代码平台的特点和功能低代码平台的应用场景和优势低代码的优点低代码的缺点低代码平台项目开发流程选择和实施低代码平台 低代码未来的发展趋势低代码平…

MyBatis缓存-提高检索效率的利器--一级缓存

&#x1f600;前言 本篇博文是关于MyBatis一级缓存的介绍使用和缓存失效情况分析&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家…

c++基础知识(inline、auto、nullptr)

⭐️ 内联函数 &#x1f4ac; 为什么会有内联函数&#xff1f;   内联函数其实是为了弥补 c 的缺陷&#xff0c;比如当我们遇到了一些少量逻辑和代码的情况时&#xff0c;而这些少量的代码又需要被重复使用多次&#xff08;swap&#xff09;&#xff0c;我们往往会封装成为一…

linux快速安装tomcat

linux快速安装tomcat 前提安装好jdk 下载Tomcat安装包 wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz如果出现颁发的证书已经过期的错误提示,用下面命令 wget --no-check-certificate https://dlcdn.apache.org/tomcat/tomcat-1…

剑指 Offer 第二版

剑指 Offer 第二版 文章目录 剑指 Offer 第二版[剑指 Offer 06. 从尾到头打印链表](https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId13&tqId23278&ru/exam/oj/ta&qru/ta/coding-interviews/question-ranking&sourceUrl%2Fexam%2Foj…

区块链实验室(13) - 在PBFT中节点的度与其流量的特征

前面若干实验说明了PBFT的耗时、流量与度的特征&#xff0c;见 区块链实验室(10) - 实例说明PBFT的共识过程, 区块链实验室(11) - PBFT耗时与流量特征, 区块链实验室(12) - 网络拓扑对PBFT共识流量的影响 同样的实验方案&#xff0c;在100个节点构成的无标度网络中完成100次交…

html学习4(区块、布局)

1、<div> 是块级元素&#xff0c;它独占一行&#xff0c;可以设置宽度、高度以及边距等样式属性。它适合用于创建页面的大块结构&#xff0c;例如页面的主体区域、容器、布局等。 2、<span> 是行内元素&#xff0c;它不会独占一行&#xff0c;宽度默认由其内容决定…

Ubuntu20.04安装Autoware.universe并与Awsim联调

文章目录 引言一、安装依赖1.1 安装git1.2 克隆Autoware到本地1.3 自动安装相关依赖1.4 安装显卡驱动1.5 安装ROS2 Galactic1.6 安装ros2_dev_tools1.7 安装rmw_implementation1.8 安装pacmod1.9 安装autoware_core1.10 安装autoware universe dependencies1.11 安装pre_commit…

(2)Gymnasium--CartPole的测试

1、主要参考 &#xff08;1&#xff09; CartPole 强化学习详解1 - DQN_Oxalate-c的博客-CSDN博客 &#xff08;2&#xff09;官方文档&#xff0c;推荐&#xff01;&#xff01;&#xff01;&#xff01; Cart Pole - Gymnasium Documentation 2、相关说明 2.1 动作空间 …