在上一篇博客《微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装》中,我将WxValidate做了再次封装,简化了初始规则数据的构造,但是当有错误时页面上的表现还是通过弹出框的形式,且只能弹出第一个错误,这种做法总体感觉还是不太友好的,没有看过效果的同学可以先看上一篇文章。

今天抽空把错误呈现的方式重新修改了下,按照惯例,先看最终效果

通过上面的效果可以看到,当页面表单验证有错误时,将显示所有的错误,且自动定位到相应的表单处,由于考虑到手机屏幕一般都不大,所以最后会自动隐藏。这里我为了使最终的图片比较小,设置的隐藏动画的时间只有3秒,实际使用时,可以设置的稍微长点。

目前这种效果在使用时,也还是有一定的不足,例如我展示的这样,页面需要填写的东西非常多,报的错误也非常多,那么因为是同时消失,所以会导致使用者看不全所有的错误,但是由于微信小程序在动态修改页面样式、动态添加控件方面实在太坑爹,如果要完全做到跟WEB一样,最后会导致开发和使用过程中非常复杂,我个人觉得没有这个必要,毕竟在小程序里,这种页面不可能太多,太多了用小程序也不合适。

一、修改wxml文件

在页面上新增错误显示的容器元素,直接使用下面的,不用修改。

  1.  
    <block wx:for="{{arrValidate}}" wx:for-item="validateErrorText">
  2.  
    <view class="validateText" animation="{{vaildateErrorText_animation}}" style="visibility:{{validateErrorText.visibility}};top:{{validateErrorText.top}};left:{{validateErrorText.left}};">
  3.  
    {{validateErrorText.msg}}
  4.  
    </view>
  5.  
    </block>

二、修改app.wxss文件

新增错误显示容器的样式。

  1.  
    .validateText{
  2.  
    visibility:hidden;
  3.  
    position: absolute;
  4.  
    color: red;
  5.  
    border: 1px solid #dfdfdf;
  6.  
    width: 400rpx;
  7.  
    min-height: 25px;
  8.  
    box-shadow: 2px 2px 2px #888888;
  9.  
    border-radius:5px;
  10.  
    display: flex;
  11.  
    align-items:flex-start;
  12.  
    justify-content:flex-end;
  13.  
    padding: 5px;
  14.  
    background-color: #ffffff;
  15.  
    opacity:0.87;
  16.  
    z-index: 999;
  17.  
    }
  18.  
    .validateText:before{
  19.  
    content: '* ';
  20.  
    }

三、修改WxValidate.js

  1.  
    query.selectAll(".wxValidate").fields({
  2.  
    id: true,
  3.  
    size:true,
  4.  
    dataset: true,
  5.  
    rect:true,
  6.  
    properties: ['validate', 'fieldname'],
  7.  
    context: true
  8.  
    }, function(res) {
  9.  
    res.dataset
  10.  
    res.context
  11.  
    }).exec(function(res) {
  12.  
    const arr = res[0];
  13.  
    //console.log(arr)
  14.  
    for (const i in arr) {
  15.  
    var id = arr[i].id
  16.  
    var fieldname = arr[i].dataset.fieldname;
  17.  
    var validate = util.trim(arr[i].dataset.validate);
  18.  
    rules[id] = util.defaultIfEmpty(rules[id], {});
  19.  
    messages[id] = util.defaultIfEmpty(messages[id], {})
  20.  
    messages[id].top = arr[i].top;
  21.  
    messages[id].left = arr[i].left;
  22.  
    messages[id].width = arr[i].width;
  23.  
    that.__getFormatValidate(rules[id], messages[id], id, fieldname, validate);
  24.  
    }
  25.  
    });

主要是多了messages[id].top = arr[i].top;        messages[id].left = arr[i].left;        messages[id].width = arr[i].width;

用于获取当前表单的位置和宽度,用于错误显示框的定位。

四、修改提交表单事件

  1.  
    formSubmit: function (e) {
  2.  
    util.loadingMsg("数据提交中,请稍后...");
  3.  
    var that = this;
  4.  
    console.log('form发生了submit事件,携带的数据为:', e.detail.value)
  5.  
    const params = e.detail.value;
  6.  
    console.log(params)
  7.  
    console.log(this.WxValidate.rules)
  8.  
    console.log(this.WxValidate.messages)
  9.  
    //校验表单
  10.  
    if (!this.WxValidate.checkForm(params)) {
  11.  
    var arrValidate = new Array();
  12.  
    let top = 0;
  13.  
    for (const i in this.WxValidate.errorList){
  14.  
    const error = this.WxValidate.errorList[i]
  15.  
    if(i==0){
  16.  
    top = error.top;
  17.  
    }
  18.  
    const validateErrorText= {id:error.param, visibility: "inherit", top: error.top + "px", left: error.left + "px", msg: error.msg }
  19.  
    arrValidate[i]=validateErrorText;
  20.  
    }
  21.  
    this.setData({arrValidate: arrValidate});
  22.  
     
  23.  
    // const error = this.WxValidate.errorList[0]
  24.  
    // //util.alert("错误提示",error.msg+error.left+" ** "+error.top)
  25.  
     
  26.  
    // that.setData({
  27.  
    // validateErrorText: { visibility:"inherit",top:error.top+"px",left:error.left+"px",msg:error.msg}
  28.  
    // })
  29.  
    wx.pageScrollTo({
  30.  
    scrollTop: top,
  31.  
    duration:500
  32.  
    });
  33.  
    setTimeout(function(){
  34.  
    console.log("***timeout")
  35.  
    util.fadeOut(that, "vaildateErrorText_animation", 0);
  36.  
    },5000);
  37.  
    wx.hideLoading();
  38.  
    return false
  39.  
    } wx.hideLoading();
  40.  
    //向后台发送时数据 wx.request...
  41.  
    util.alert("成功提示", '提交成功 :' + e.detail.value.date);
  42.  
    }

这里主要是将所有的错误循环出来并显示。

五、修改util.js

新增一个淡入淡出的动画函数:

  1.  
    function fadeOut(that, animationId, opacity, data) {
  2.  
    var animation = wx.createAnimation({
  3.  
    duration: 3000,
  4.  
    timingFunction: 'ease',
  5.  
    });
  6.  
    animation.opacity(opacity).step();
  7.  
    var json = {};
  8.  
    json[animationId] = animation.export();
  9.  
    if(isNotEmpty(data)){
  10.  
    Object.assign(json,data)
  11.  
    }
  12.  
    //设置动画
  13.  
    that.setData(json);
  14.  
    }

在CSDN的本文链接:https://blog.csdn.net/zhuiyue82/article/details/100040614

微信小程序——表单验证插件WxValidate的二次封装(二)的更多相关文章

  1. 微信小程序——表单验证插件WxValidate的二次封装(终极版)

    微信小程序表单验证前面的两篇文章做的效果总感觉都有点不太友好,第一篇里的效果是将错误信息通过对话框形式弹出来,这种形式在web形式下早已经淘汰了:第二篇是一次性全部显示所有的错误,然后3秒后自动消失, ...

  2. 微信小程序 - 表单验证插件WxValidate使用

    插件下载地址及官方文档:https://github.com/skyvow/wx-extend 具体的WxValidate.js文件的位置在wx-extend/src/assets/plugins/w ...

  3. 微信小程序 - 表单验证插件WxValidate(自定义警告信息形式)

    弹出的形式对于用户来说,总是不太友好的 可能会出现层级问题(只需要设置一下提示的层级即可) WxValidate内置规则 以下代码拷贝即可使用~ wxml <form bindsubmit='s ...

  4. 微信小程序——仿jqueryValidate表单验证插件WxValidate的二次封装(一)

    在做web开发时,表单验证插件我们前端用的是jqueryValidate,由于个人主要精力是在后台JAVA开发上,为了让插件与后台更好的结合和使用,通过JAVA的自定义组件将表单全部重新写了一边,同时 ...

  5. 微信小程序-表单

    wxml <view> 按钮: <button size="{{buttom.size}}" type="{{buttom.type}}" p ...

  6. 微信小程序-表单组件

    button 按钮 注:button-hover 默认为{background-color: rgba(0, 0, 0, 0.1); opacity: 0.7;} 示例代码: /** wxss **/ ...

  7. 微信小程序-表单笔记

    发布页——向云端数据库上传多行文字和4张图片 第6,8行注释掉和不注释掉都可以实现数据上传 var _this = this; wx.cloud.callFunction({ name: 'searc ...

  8. 微信小程序 --- 表单输入验证(手机号、邮箱验证、输入非空)

    js代码 Page({                   /**    * 页面的初始数据    */         data: {         indicatorDots: false,   ...

  9. 微信小程序-表单笔记2

    本地添加4张图片并显示至页面——组件位置.设置样式.列表渲染 Q.button是一张图片,需要实现点击这张图片后选择本地图片后显示至页面,不知道怎么让本地图片将button挤到右边  S.在wxml中 ...

随机推荐

  1. Linux上用IP转发使内部网络连接互联网

    IP转发的概念: 使 Linux 机器像路由器一样将数据从一个网络发送到另一个网络.所以,它能作为一个路由器或者代理服务器,实现将一个连接的互联网或者网络连接共享给多个客户端机器. 1. 启用 IPv ...

  2. Aiseesoft 4K Converter for Mac如何转换视频格式?Aiseesoft 4K使用方法

    Aiseesoft 4K如何转换视频格式?由于这款4K UHD转换器支持最新的4K编码/解码技术,因此您可以将4K视频转换为4K电视或其他设备支持的任何其他视频格式.Aiseesoft 4K使用方法分 ...

  3. 使用Condition

    /** * ReentrantLock使用Condition对象来实现wait和notify的功能* 使用Condition时,引用的Condition对象必须从Lock实例的newCondition ...

  4. easybcd误删Win10启动项,UEFI恢复引导

    参考文章https://blog.csdn.net/A_Sen_A/article/details/89545311 想给电脑安Ubuntu双系统,期间根据一些不靠谱的文章用了easybcd软件,Ub ...

  5. Azure上的时序见解,Time series insights

    5G来了,广连接(mmTC)可以实现每平方千米100万的连接数(理论值),是4G的10倍,5G网络出现,配合其他技术,空间将在数据意义上剧烈压缩,车联网.智能家居.智能安防.智慧工厂.智慧能源都可能带 ...

  6. Nginx 入门学习

    什么是 Nginx Nginx 是一款轻量级高性能的web 和 反向代理服务器,类似于Apache,也是一个 IMAP/POP3/SMTP (电子邮件)代理服务器.由俄罗斯程序设计师 Igor Sys ...

  7. 百度地图在jsp页面加载大量轨迹导致地图卡顿

    原画线方式: //存储大量点轨迹json数组:historyPathList for(var i=0;i<historyPathList.length-1;i++){ drawColorLine ...

  8. 通过程序调用微信公众号发消息api返回48001

    自己的订阅号,尝试通过写程序来给用户发消息.结果呢,接口返回报错:errcode=48001,errmsg = api unauthorized hint: [ZlPULa02942276!] 去微信 ...

  9. 【Kafka】《Kafka权威指南》——提交和偏移量

    KafkaConsumer(消费者)每次调用 poll()方法,它总是返回由生产者写入 Kafka但还没有被消费者读取过的记录, 我们因 此可以追踪到哪些记录是被群组里的哪个消费者读取的.之前已经讨论 ...

  10. jquery仿淘宝购物车页面商品结算(附源码)

    1.效果图如下: 2.源码如下: html部分: <!doctype html> <html lang="en"> <head> <met ...