【前端】没有了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进行处理。

你可能感兴趣的:(踩过的坑,前端,vue.js,javascript,elementui)