解决vue表单为空也能提交的问题

目录
  • vue表单为空也能提交
    • 大概是这样写的
  • vue的表单提交方式
    • vue表单收集和提交

vue表单为空也能提交

今天在用Vue写表单验证的时候,习惯性把v-model绑定的值设置为null,然后再测试的时候,发现如果填写了表单后,又删除输入的内容,竟然能提交上去,百思不得其解。

最后通过vue devtools这个工具找到了问题所在。

大概是这样写的

<input v-model="ipt"  />
data () {
    return {
        ipt: null,
    }
}
if(this.ipt !== null) {
    axios.post()...
}

研究了老半天,最后通过vue工具发现最初设置ipt的值为null,当表单输入内容,又删除之后,虽然内容不见了,但是ipt的值变为了'',这样就不能通过简单的!== nulll来判断了。

if(this.ipt !== null &&  this.ipt) {
    axios.post()...
}

vue的表单提交方式

每次做项目都会用,也会踩一些坑,这里统一整理一下,当个模板用

vue表单收集和提交

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="app">
        <form :model="form" @submit.prevent="submit">
            <div>
                <label>用户名
                    <input v-model.trim="form.username" type="text" placeholder="请输入用户名">
                </label>
            </div>
            <div>
                <label>密码
                    <input v-model="form.password" type="password" placeholder="请输入密码">
                </label>
            </div>
            <div>
                <label>头像<input type="file" @change="handleChange"></label>
            </div>
            <div>
                <label>姓名
                    <input v-model.trim="form.name" type="text" placeholder="请输入您的姓名">
                </label>
            </div>
            <div>
                <label>性别
                    <label><input v-model="form.sex" type="radio" name="sex" value="male">男</label>
                    <label><input v-model="form.sex" type="radio" name="sex" value="female">女</label>
                </label>
            </div>
            <div>
                <label>年龄
                    <input type="number" v-model.number="form.age" placeholder="请输入年龄">
                </label>
            </div>
            <div>
                <label>爱好
                    <label>
                        <input v-model="form.hobby" type="checkbox" value="study">学习
                    </label>
                    <label>
                        <input v-model="form.hobby" type="checkbox" value="games">打游戏
                    </label>
                    <label>
                        <input v-model="form.hobby" type="checkbox" value="eat">吃饭
                    </label>
                </label>
            </div>
            <div>
                <label>所属校区
                    <select v-model="form.campus">
                        <option value="beijing">北京</option>
                        <option value="shanghai">上海</option>
                        <option value="shenzhen">深圳</option>
                        <option value="wuhan">武汉</option>
                    </select>
                </label>
            </div>
            <div>
                <label>其他信息
                    <textarea v-model.lazy="form.other" style="vertical-align: middle;" cols="30" rows="10"></textarea>
                </label>
            </div>
            <div>
                <label>
                    <input v-model="form.accept" type="checkbox">
                    阅读并接受<a href="http://www.baidu.com" rel="external nofollow" >《用户协议》</a>
                </label>
            </div>
            <div>
                <button>提交</button>
            </div>
        </form>
    </div>
    <script src="lib/vue.js"></script>
    <script>
        Vue.config.productionTip = false
        const vm = new Vue({
            el: '#app',
            data() {
                return {
                    form: {
                        hobby: []
                    },
                    image: {}
                }
            },
            methods: {
                submit() {
                    console.log(this.form);
                    //在这里进行上传(axios、ajax)
                },
                handleChange(event) {
                    let file = event.target.files[0]
                    this.form.image = file
                }
            },
        })
    </script>
</body>
</html>

上述代码有三点需要说明

  • 在<form>标签中出现了:model="form",这是为了将form中的各项数据动态收集到vue的data中的form对象中,方便统一管理
  • form标签上的@submit.prevent为提交时阻止表单的默认行为(跳转)
  • v-model.trim是将输入的数据去除前后的空格;v-model.number是转换为Number类型;v-model.lazy是失去焦点后再把数据渲染到页面上

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Vue表单提交点击事件只允许点击一次的实例

    常用出现场景:商城点击订单提交 1.使用Vue封装事件 body: <template> <div> <el-button @click.once="submitOrder()">提交订单</el-button> </div> </template> 方法: methods: { submitOrder() { // 处理逻辑 } } 2.使用原生JS事件 在数据data里面声明一个flag属性 data() {

  • vue 解决form表单提交但不跳转页面的问题

    vue使用@submit.prevent=""来设置提交时执行的函数,并阻止页面跳转: <form id="msgForm" action="" method="post" @submit.prevent="sub"> sub函数写在methods内: methods:{ $.post('http://api.test.ai/visitorinfo/', $('#msgForm').serial

  • 关于vue表单提交防双/多击的例子

    先说下出现场景: 测试这次比较极端(也有可能是测试又学会什么新知识了,哈哈),说是在点击提交和调用之间有可能有狂暴的用户在多连击,就像打游戏一样,调用接口后的loading状态切换就无效了 然后,就只好自己写了个基于vue防多击的指令,小小偷懒了下,我里面已经注入fastClick了,因此响应方法是极快的,因此只需要稍微控制下二次点击的时间即可 export default {}.install = (Vue, options = {}) => { Vue.directive('dbClick'

  • vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作

    在项目中做联系人的添加和编辑功能,点击父级页面的添加和编辑按钮,用的是同一个表单弹窗,数据添加和编辑用同一个弹窗,没有在弹窗使用v-if,性能不是很好,弹窗中有表单,在编辑弹窗表单数据之后关闭弹窗,然后点击添加的时候,弹窗里的表单数据还是之前编辑的数据,无法做到清空表单数据,接下来是解决方法了,嘿嘿 首先是不管是添加还是编辑,都需要将子组件需要的对象属性一一写出来,传给子组件, 然后是主要用到了el-form表单有一个清空重置表单数据的事件方法resetField(),在子组件表单弹窗打开的时候

  • 详解Vue返回值动态生成表单及提交数据的办法

    目录 主要解决的问题 一.后端返回的数据,提交到后端的数据格式如下: 二.vue前端代码如下: 总结 主要解决的问题 1.vue在循环的时候需要动态绑定不同的v-model:vue动态的表单,数据怎么绑定呢? 2.动态表单上所有name属性对应的键值对的形式提交到后端 一.后端返回的数据,提交到后端的数据格式如下: // 后端返回的数据,根据返回类型用对应的组件 [ { "componentType": "input", "componentName&qu

  • vue表单数据交互提交演示教程

    欢迎来到 vue-form 表单提交演示间, 你有更好的建议,请告知楼主额! 1. 客户端 html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="https://

  • 解决vue表单为空也能提交的问题

    目录 vue表单为空也能提交 大概是这样写的 vue的表单提交方式 vue表单收集和提交 vue表单为空也能提交 今天在用Vue写表单验证的时候,习惯性把v-model绑定的值设置为null,然后再测试的时候,发现如果填写了表单后,又删除输入的内容,竟然能提交上去,百思不得其解. 最后通过vue devtools这个工具找到了问题所在. 大概是这样写的 <input v-model="ipt"  /> data () {     return {         ipt:

  • 解决Layui 表单提交数据为空的问题

    坑的外观 最近用了一段时间Layui作为项目后台管理模块的前端框架,感觉还是挺好用的. 今天踩了个坑,就是使用layui表单提交时,提交的数据为空. 例如,layer.msg(JSON.stringify(data.field));这句代码执行后,页面显示为空对象. <form class="layui-form" action=""> <div class="layui-form-item"> <label cla

  • vue 表单之通过v-model绑定单选按钮radio

    用v-model绑定单选框能带来很多便捷的开发体验. 基础用法 <template> <div id="app"> <input type="radio" id="male" value="Male" v-model="gender"> Male <input type="radio" id="female" value=&q

  • Vue表单验证插件的制作过程

    前言 前段时间,老大搭好了Vue的开发环境,于是我们愉快地从JQ来到了Vue.这中间做的时候,在表单验证上做的不开心,看到vue的插件章节,感觉自己也能写一个,因此就自己开始写了一个表单验证插件va.js. 当然为什么不找个插件呢? vue-validator呀. 1.我想了下,一个是表单验证是个高度定制化的东西,这种网上找到的插件为了兼顾各个公司的需求,所以加了很多功能,这些我们不需要.事实证明,vue-validator有50kb,而我写的va.js只有8kb. 2.另一个是,vue-val

  • vue表单自定义校验规则介绍

    如下所示: <div id="app"> <el-form :model="ruleForm2" :rules="rules2" ref="ruleForm2" label-width="100px" class="demo-ruleForm"> <el-form-item label="密码" prop="pass"

  • vue 表单验证按钮事件交由父组件触发的方法

    vue 表单验证按钮事件交由父组件触发,不直接再子组件上操作的方法 子组件: //内容部分 <Form ref="formCustom" :model="formCustom" :rules="ruleCustom" :label-width="80"> <FormItem label="Age" prop="age"> <Input type="

  • vue+elementUI 复杂表单的验证、数据提交方案问题

    当我们在做后台管理系统时,经常会遇到非常复杂的表单: 表单项非常多 在各种表单类型下,显示不同的表单项 在某些条件下,某些表单项会关闭验证 每个表单项还会有其他自定义逻辑,比如 输入框可以插入模板变量.输入字符数量显示.图片上传并显示.富文本 ... 在这种错综复杂的情况下,完成表单的验证和提交 可以查看具体例子:例子中省略了很多琐碎的功能,只保留整体的复杂表单框架,用于展示解决方案 方案1: 在一个 vue 文件中 所有的表单项显示隐藏.验证.数据获取.提交.自定义等逻辑放在一起 v-if/v

  • vue 表单输入格式化中文输入法异常问题

    v-model 是 vue.js 提供的语法糖,根据不同的表单控件监听不同的事件,实现对表单控件的数据双向绑定. 当控件是 <input> 输入框时,v-model 监听其 input 事件. 如下所示,这两种写法有什么区别吗? <input :value="name" @input="name = $event.target.value"><input v-model="name"> 输入中文格式化问题 表单

  • 解决LayUI表单获取不到data的问题

    前几天用LayUI表单进行AJAX提交的时候发现,function(data)里的data始终无法获取表单里填的值,当时我认为是出BUG了就用了$('#updateform').serialize()来获取表单数据 //form表单 更新员工信息 form.on('submit(form_emp2)', function(data){ var temp=$('#updateform').serialize(); // layer.msg(JSON.stringify($('#form1').se

随机推荐