广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js前端表单数据处理表单数据校验
  • 178
分享到

js前端表单数据处理表单数据校验

2024-04-02 19:04:59 178人浏览 泡泡鱼
摘要

目录前言1.数据处理1.1 场景1 :过滤我不要的数据1.2 场景2:只提取我要的数据1.3 场景3 :覆盖数据1.4 场景4 :字段映射1.5 场景5 : 数据映射1.6 场景6:

前言

这段时间一直在搞to B方向中后台的项目,表单接触的频率会比较多,就突发奇想聊聊表单数据相关的一些基础分享

1.数据处理

当表单在视图所展示的数据并不是后端需要的数据,或者后端返回的数据不是前端所要展示的内容,这时就需要进行数据转换,下面介绍几种常见的场景

我假设有下面的一组form基础数据

 data(){
    return {
      form:{
        name: '商品名称',
        id: '订单编号',
        nickName: '商品别名',
        num: '商品数量',
        price:'价格',
        tag: '0' // 1 表示特价  0 表示无特价
      },
    }
 },

1.1 场景1 :过滤我不要的数据

场景:当前端form中的数据存在冗余的字段,也就是说后端并不需要这些字段,我们可以通过过滤把不必要的字段筛选掉

  const noRequired = ['tag', 'nickName']; //不需要的字段
    const formData = Object.keys(this.form)
      .filter(each => !noRequired.includes(each))
      .reduce((acc, key) => (acc[key] = this.form[key], acc), {});

1.2 场景2:只提取我要的数据

场景:后端不需要表单数据那么多数据,只需要一部分时可以用

const formData= JSON.parse(
      jsON.stringify(this.form,["nickName","price"])
);

1.3 场景3 :覆盖数据

场景:当前表单有部分字段需要替换或覆盖新的数据时可用

Object.assign(this.form, {
  tag: '商品1' 
}

1.4 场景4 :字段映射

当前表单字段需要映射为其他字段名称时可用,如下对应的name的key值换为Name

  • 单个字段映射情况
const formData = JSON.parse(
      JSON.stringify(this.form).replace(
        /name/g,
        'Name')
);

  • 多字段映射情况
const mapObj = {
      name: "Name",
      nickName: "NickName",
      tag: "Tag"
    };

const formData = JSON.parse(
      JSON.stringify(this.form).replace(
        /name|nickName|tag/gi,
        matched => mapObj[matched])
   );

ps:这种方式有bug,你知道是什么吗?

1.5 场景5 : 数据映射

当字段存在0,1等状态数,需要转换成为相对应的表示时可用,如下对应的tag字段,0对应特价,1对应无特价,进行映射转换

const formData = JSON.parse(JSON.stringify(this.form,(key,value)=>{
      if(key == 'tag'){
        return ['特价','无特价'][value];
      }
      return value;
}));

1.6 场景6: 数据合并

数据合并,将表单数据字段合并,注意的是,如果字段相同,会覆盖前面表单数据字段的数值

 const query = { tenaid: '订单编号', id:'查询ID'}
   const formData = {
     ...this.form,
     query
   }

2.表单校验

当表单数据填写完成,需要进一步做表单提交传送后端服务器,但是前端需要做数据的进一步确实是否符合规则,比如是否为必填项、是否为手机号码格式

2.1 简单版的单字段检查

data() {
    return {
       schema:{
          phone: {
            required:true
          },
       }
    };
 },
 methods: {
    // 判断输入的值
     validate(schema, values) {
       for(field in schema) {
          if(schema[field].required) {
            if(!values[field]) {
              return false;
            }
          }
        }
       return true;
    },
 }
console.log(this.validate(schema, {phone:'159195**34'}));

2.2 简单版的多字段检查

data() {
    return {
       phoneForm: {
          phoneNumber: '',
          verificationCode: '',
          tips:''
       },
       schema:{
          phoneNumber: [{required: true, error: '手机不能为空'}, {
            regex: /^1[3|4|5|6|7|8][0-9]{9}$/,
            error: '手机格式不对',
          }],
          verificationCode: [{required: true, error: '验证码不能为空'}],
       }
    };
 },
 methods: {
    // 判断输入的值
     validate(schema, values) {
      const valArr = schema;
      for (const field in schema) {
        if (Object.prototype.hasOwnProperty.call(schema, field)) {
          for (const key of schema[field]) {
            if (key.required) {
              if (!valArr[field]) {
                valArr.tips = key.error;
                return false;
              }
            } else if (key.regex) {
              if (!new RegExp(key.regex).test(valArr[field])) {
                valArr.tips = key.error;
                return false;
              }
            }
          }
        }
      }
      return true;
    },
 }
console.log(this.validate(this.schema, this.phoneForm);

2.3 Iview 组件库 form表单组件的校验实现

Iview 的 Form 组件模块主要由Form 和 FormItem组成

  • Form 主要是对form做一层封装
  • FormItem 是一个包裹,主要用来包装一些表单控件、提示消息、还有校验规则等内容。

源码链接

我们可以清晰看到,iview的 form 组件是通过async-validator工具库来作为表单验证的方法

  • async-validator的基本使用

官方例子如下? 文档链接

import schema from 'async-validator';
var descriptor = {
  address: {
    type: "object", required: true,
    fields: {
      street: {type: "string", required: true},
      city: {type: "string", required: true},
      zip: {type: "string", required: true, len: 8, message: "invalid zip"}
    }
  },
  name: {type: "string", required: true}
}
var validator = new schema(descriptor);
validator.validate({ address: {} }, (errors, fields) => {
  // errors for address.street, address.city, address.zip
});

而在iview的 form 组件中主要定义了validate函数中使用 field.validate就是调用async-validator的方法,用来管理form-item组件下的验证

// ViewUI/src/components/form/form.Vue
methods:{
    validate(callback) {
        return new Promise(resolve => {
            let valid = true;
            let count = 0;
            this.fields.forEach(field => {
                field.validate('', errors => {
                    if (errors) {
                        valid = false;
                    }
                     // 检验已完成的校验的数量是否完全,则返回数据有效
                    if (++count === this.fields.length) {
                        // all finish
                        resolve(valid);
                        if (typeof callback === 'function') {
                            callback(valid);
                        }
                    }
                });
            });
     });
    },
    //针对单个的校验
     validateField(prop, cb) {
       const field = this.fields.filter(field => field.prop === prop)[0];
         if (!field) {throw new Error('[iView warn]: must call validateField with valid prop string!'); }
           field.validate('', cb);
      }
     //表单规则重置
     resetFields() {
        this.fields.forEach(field => {
            field.resetField();
        });
   },
},
created () {
    //通过FormItem定义的prop来收集需要校验的字段,
    this.$on('on-form-item-add', (field) => {
        if (field) this.fields.push(field);
        return false;
    });
    // 移除不需要的字段
    this.$on('on-form-item-remove', (field) => {
        if (field.prop) this.fields.splice(this.fields.indexOf(field), 1);
        return false;
    });
 }

Form.vue 中涉及到的 this.fields 里面的规则 是在其create生命周期时通过监听‘on-form-item-add’push进来的,‘on-form-item-add’事件是由form-item 组件 触发相对应的事件,并传入相对应的实例就可以创建数据的关联,以下是form-item的生命周期函数内容:

// ViewUI/src/components/form/form-item.vue
mounted () {
         // 如果定义了需要验证的字段
          if (this.prop) {
                // 向父亲Form组件添加field
                this.dispatch('iForm', 'on-form-item-add', this);
                Object.defineProperty(this, 'initialValue', {
                    value: this.fieldValue
                });
                this.setRules();
            }
 },
  beforeDestroy () {
    // 移除之前删除form中的数据字段
    this.dispatch('iForm', 'on-form-item-remove', this);
}
  methods: {
            setRules() {
                //获取所有规则
                let rules = this.getRules();
                if (rules.length&&this.required) {
                    return;
                }else if (rules.length) {
                    rules.every((rule) => {
                        this.isRequired = rule.required;
                    });
                }else if (this.required){
                    this.isRequired = this.required;
                }
                this.$off('on-form-blur', this.onFieldBlur);
                this.$off('on-form-change', this.onFieldChange);
                this.$on('on-form-blur', this.onFieldBlur);
                this.$on('on-form-change', this.onFieldChange);
            },
             getRules () {
             let formRules = this.form.rules;
             const selfRules = this.rules;
             formRules = formRules ? formRules[this.prop] : [];
             return [].concat(selfRules || formRules || []);
           },
           validate(trigger, callback = function () {}) {
                let rules = this.getFilteredRule(trigger);
                if (!rules || rules.length === 0) {
                    if (!this.required) {
                        callback();
                        return true;
                    }else {
                        rules = [{required: true}];
                    }
                }
                // 设置AsyncValidator的参数
                this.validateState = 'validating';
                let descriptor = {};
                descriptor[this.prop] = rules;
                const validator = new AsyncValidator(descriptor);
                let model = {};
                model[this.prop] = this.fieldValue;
                validator.validate(model, { firstFields: true }, errors => {
                    this.validateState = !errors ? 'success' : 'error';
                    this.validateMessage = errors ? errors[0].message : '';
                    callback(this.validateMessage);
                });
                this.validateDisabled = false;
          },
}

感兴趣小伙伴可以在这个基础上通过源码的学习深入研究iview组件库的form表单校验的具体实现。

2.4 element 组件库 ElForm表单组件的校验实现

element的ElForm表单组件校验原理跟上一节讲的iview组件库很像,这里就不做大篇幅介绍说明,直接“上才艺”-----源码链接

2.5 常见校验规则

通过不同正则规则,来约束不同类型的表单数据是否符合要求

是否为手机号码: /^1[3|4|5|6|7|8][0-9]{9}$/

是否全为数字: /^[0-9]+$/

是否为邮箱:/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/

是否为身份证:/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/

是否为Url:/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/

是否为IP: /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/

以上就是js前端表单数据处理表单数据校验的详细内容,更多关于js前端表单数据校验处理的资料请关注编程网其它相关文章!

--结束END--

本文标题: js前端表单数据处理表单数据校验

本文链接: https://www.lsjlt.com/news/153998.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • js前端表单数据处理表单数据校验
    目录前言1.数据处理1.1 场景1 :过滤我不要的数据1.2 场景2:只提取我要的数据1.3 场景3 :覆盖数据1.4 场景4 :字段映射1.5 场景5 : 数据映射1.6 场景6:...
    99+
    2022-11-13
  • js前端表单数据处理和校验怎么实现
    这篇文章主要介绍了js前端表单数据处理和校验怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇js前端表单数据处理和校验怎么实现文章都会有所收获,下面我们一起来看看吧。1.数据处理当表单在视图所展示的数据并...
    99+
    2023-07-02
  • js前端设计模式优化50%表单校验代码示例
    目录表单校验背景常规写法:策略模式介绍真实世界类比更广义的“算法”策略模式的组成利用策略模式改写策略模式优缺点优点:缺点:策略模式适合应用场景总结表单校验 背...
    99+
    2022-11-13
  • hibernate-validator后端表单数据校验的使用示例详解
    目录hibernate-validator后端表单数据校验的使用1、hibernate-validator介绍2、hibernate-validator常用注解3、 hibernat...
    99+
    2022-11-13
  • JavaScript 表单数据验证
    JavaScript 表单HTML 表单验证可以通过 JavaScript 来完成。HTML 表单验证也可以通过浏览器来自动完成。如果表单字段 (fname) 的值为空, required 属性会阻止表单提交:。。。。。。数据验证:数据验证...
    99+
    2023-06-03
  • 利用PHP表单处理函数实现表单数据的验证和处理功能
    利用PHP表单处理函数实现表单数据的验证和处理功能在网页开发中,表单是用户输入数据的主要交互方式之一。当用户提交表单时,我们需要对其输入的数据进行验证和处理,以确保数据的准确性和安全性。PHP表单处理函数提供了一种简单而有效的方式来实现这一...
    99+
    2023-11-20
    数据验证 PHP 表单处理函数
  • validate 注册页的表单数据校验实现详解
    目录1.注册页是什么2.为什么需要注册页3.注册页如何实现3.1分析业务需求3.2获取数据 v-model双向绑定3.3校验数据3.4method中的发送数据3.5处理数据4总结1....
    99+
    2022-11-13
  • PHP如何处理表单数据
    这篇文章主要介绍“PHP如何处理表单数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP如何处理表单数据”文章能帮助大家解决问题。一、PHP处理表单数据在PHP中,可以使用$_POST和$_GE...
    99+
    2023-07-05
  • PHP表单处理函数实现表单数据的验证和处理功能的方法总结
    PHP表单处理函数实现表单数据的验证和处理功能的方法总结随着互联网的发展,表单是网站开发中不可或缺的一部分,用于与用户进行交互,搜集用户输入的数据。但是,用户输入的数据往往是不可预测的,为了保证网站的安全和数据的有效性,我们需要对表单数据进...
    99+
    2023-11-20
    表单 验证 编程关键词:PHP
  • PHP学习笔记:表单处理与数据验证
    在网页开发中,表单是用户与网站进行交互的重要组件之一。当用户在网站上填写表单并提交数据时,网站需要对提交的数据进行处理和验证,确保数据的准确性和安全性。本文将介绍如何使用PHP来处理表单和进行数据验证,并提供具体的代码示例。表单提交和数据预...
    99+
    2023-10-21
    数据验证 表单处理 PHP学习
  • 报表工具之数据校验竟可以如此简单
    在报表开发过程中,为了保证信息准确无误入库, 我们经常会被要求对报表增加校验以保证数据类型和格式的正确。比如:工资金额最多只允许包含两位小数、邮政编码必须是全数字组成的 6 位数且首位数字不能是 0 等等。面对多种多样、层出不穷的校验需求,...
    99+
    2023-06-02
  • 表单生成器(Form Builder)之mongodb表单数据——整理数据 - du
      在上篇笔记中,为车辆信息表、车辆耗损表以及车辆营收表插入了一些数据。之后便是查询了,重点也在查询……按照之前定好的数据结构,如果是查询mongodb document的最外层比较简单,但是我们的重点应该是FormItems表单项集合中的...
    99+
    2021-09-27
    表单生成器(Form Builder)之mongodb表单数据——整理数据 - du
  • javascript中怎么验证form表单数据
    javascript中怎么验证form表单数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。直接po截图和代码下面是Check...
    99+
    2022-10-19
  • vue如何实现表单数据验证
    这篇文章主要讲解了“vue如何实现表单数据验证”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue如何实现表单数据验证”吧!为el-form表单添加:rul...
    99+
    2022-10-19
  • 教你JS更简单的获取表单中数据(formdata)
    在文章正式开始之前呢,先介绍一个知识点,那就是var和let的区别,查看了各路大佬的文章,也经过各种尝试,最终得出的结果是,let声明的变量只在该变量对应的块中有效,有点局部变量的意...
    99+
    2023-05-20
    js获取表单数据 js formdata
  • web前端从Oracle数据库加载动态菜单所用到的数据表
    当我们在使用一款软件或者使用某某管理系统的时候,都会使用到分级菜单来给我们清晰的展示出其功能模块。而这些分级菜单呢,是需要通过对数据库的调用才能展示给我们的。今天,我就主要介绍一下制作分级菜单我们所要用到的...
    99+
    2022-10-18
  • JS获取表单中数据formdata的方法
    这篇文章主要介绍了JS获取表单中数据formdata的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。在文章正式开始之前呢,先介绍一个知识点,那就是var和let的区别,查看了各路大佬的文章,也经过各种尝试,最终得出的...
    99+
    2023-07-06
  • PHP表单处理函数实现用户输入数据的验证和处理功能
    PHP是一种广泛应用于动态网页开发的脚本语言,它的优势在于简单易学、灵活性强。在网页开发中,我们经常需要通过表单来收集用户的输入数据,并进行相应的处理和验证。为了提高开发效率和减少代码重复,我们可以使用PHP表单处理函数来实现用户输入数据的...
    99+
    2023-11-20
    PHP 表单处理 函数实现
  • jQuery如何处理未编码的表单数据
    这篇“jQuery如何处理未编码的表单数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jQuery如何处理未编码的表单数据...
    99+
    2023-07-06
  • PHP表单验证函数实现用户输入数据的验证和处理功能
    PHP表单验证函数实现用户输入数据的验证和处理功能在Web开发中,用户输入数据的验证和处理是一个非常重要的环节。通过对用户输入进行验证,可以保证数据的合法性和安全性,有效地防止恶意输入和攻击。同时,对用户输入进行适当的处理可以确保数据的准确...
    99+
    2023-11-20
    PHP表单验证函数 用户输入数据 数据的验证和处理功能
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作