当前位置: 首页 > article >正文

【前端】没有了element时,怎么实现一个自己的form表单组件和表单校验(用法参考el-form)

需求

平时用习惯了el-form做表单校验,等到做小程序是,不能用element了很不习惯,准备自己手撸一个form表单组件做平替。

代码

form.vue

<template>
    <div class="cwx-form" ref="myForm">
        <slot></slot>
    </div>
</template>

<script>
export default {
    props: {
        model: {
            type: Object,
            default: () => { return {} }
        }
    },
    data() {
        return {
            requires: {}
        }
    },
    methods: {
        validate() {
            let flag = true;
            function isEmpty(value) {
                // 判断空字符串
                if (typeof value === 'string' && value.trim().length === 0) {
                    return true;
                }
                // 判断空值(null 或 undefined)
                if (value === null || typeof value === 'undefined') {
                    return true;
                }
                // 判断空数组
                if (Array.isArray(value) && value.length === 0) {
                    return true;
                }
                return false;
            }
            const findFormItems = (children) => {
                children.forEach((child) => {
                    if (child.$options.name === 'formItem' && child.require) {
                        //找到需要校验的字段
                        if (isEmpty(this.model[child.prop])) {
                            //如果为空值 需要处理
                            child.warning=true
                            flag=false
                        }else{
                            //如果校验通过,需要恢复
                            child.warning=false
                        }
                    }
                    if (child.$children) {
                        findFormItems(child.$children);
                    }
                });
            };
            findFormItems(this.$children || []);
            return flag
        }
    }
}
</script>

<style></style>

formItem.vue

<template>
    <view class="cwx-form-item" :class="{'warning':warning}">
        <span class="label">
            <span v-if="prefix" class="prefix">{{ prefix }}</span>
            <span v-if="require" class="red">*</span>{{ label }}
            <span v-if="tip" class="tip">{{ tip }}</span>
        </span>
        <slot></slot>
    </view>
</template>

<script>
export default {
    name: 'formItem',
    props:{
        label:{
            type: String,
            default:''
        },
        require:{
            type: Boolean,
            default: false,
        },
        prop:{
            type: String,
            default:''
        },
        tip: {
            type: String,
            default: ''
        },
        prefix: {
            type: String,
            default: ''
        },
    },
    data(){
        return{
            warning: false,
        }
    }
}
</script>

<style lang="scss" scoped>
.cwx-form-item{
    // padding: 0 32rpx;
    min-height: 78rpx;
}
.label{
    font-size: 28rpx;
    line-height: 28rpx;
    color: $uni-text-color;
    line-height: 78rpx;
    .red{
        color: #F53F3F;
    }
    .tip {
        font-size: 24rpx;
        margin-left: 16rpx;
        color: #ABB0AF;
    }
    .prefix {
        color: #ABB0AF;
    }
}
.warning{
    // background: rgba(244, 137, 137, 0.12);
}
</style>

使用

<MyForm class="repair-img" ref="form" :model="form">
              <div style="padding: 0 32rpx">
                <MyFormItem label="维修后图片:" prop="afterfileList" require tip="图片大小不超过5MB">
                  <file-upload
                    class="file-upload"
                    :disabled="isDetail"
                    :fileList="form.afterfileList"
                    @change="(arr)=>{form.afterfileList = arr}"
                  />
                </MyFormItem>
              </div>
          </MyForm>
this.$refs["form"].validate();

分析

因为个人的需求简单,这里只做了必填校验,没有自定义rules的功能;
如果有自定义rules这个需求,可以让form组件多接收一个rules参数,并在validate方法内自行对照字段如rules进行处理。


http://www.kler.cn/a/162543.html

相关文章:

  • CTF攻防世界小白刷题自学笔记13
  • docker:docker: Get https://registry-1.docker.io/v2/: net/http: request canceled
  • 【算法】——二分查找合集
  • -1大于4?负数与无符号整数类型:size_t的比较问题(strlen)
  • macOS解决U盘装完系统容量变小的问题
  • 5G时代的关键元件:射频微波MLCCs市场前景广阔
  • 这些接口自动化测试工具如果不知道,就真out了!
  • unity 2d 入门 飞翔小鸟 小鸟跳跃 碰撞停止挥动翅膀动画(十)
  • 机器学习-分类问题
  • Tmux中使用Docker报错 - 解决方案
  • Windows下使用CMD修改本地IP
  • SQL自学通之简介
  • PyQt6 QTimeEdit时间控件
  • YOLOv5独家原创改进:SPPF自研创新 | SPPF与感知大内核卷积UniRepLK结合,大kernel+非膨胀卷积提升感受野
  • 7天用Go实现分布式缓存
  • 简谈MySQL的binlog模式
  • ALTERNET STUDIO 9.1 Crack
  • 啃下这50道笔试题,你就是SQL专家!(附答案,收藏备用)
  • 元宇宙vr党建云上实景展馆扩大党的影响力
  • 将 ONLYOFFICE 协作空间的公共房间嵌入到网页
  • 复杂sql分析 以及 索引合并
  • 使用异或查找数组中出现奇数次的唯一或唯二数字
  • Vue.directive
  • Python 数据分析:日期型数据的玩转之道
  • 混合预编码(Hybrid Precoding)的全连接结构与子连接结构
  • 什么是自动化测试框架?常用的自动化测试框架有哪些?