一个 vuejs 的 form 表单提交结构

在初学习Laravel的过程中,看过的教程肯定都有登陆这个表单提交操作,当提交错误的时候,系统会返回$errors,而我们可以根据$errors来显示在input框下面。

但是,在写vuejs的时候,我就感觉自己比较的混乱,就是直接判断status,如果不为1,则提取发送的json数据中的msg,也就是自己定义的msg。
这几天在看Laracast的Vue2教程中的Object-Oriented Forms给了我这个初学者很好的一个解答。

create.blade.php

<form method="POST" action="/projects" @submit.prevent="onSubmit" @keydown="form.errors.clear($event.target.name)">
            <div class="field">
                <label class="label">Name</label>
                <div class="control">
                    <input class="input" type="text" name="name" placeholder="input name" v-model="form.name">
                    <span class="help is-danger" v-if="form.errors.has('name')" v-text="form.errors.get('name')"></span>
                </div>
            </div>
            <div class="field">
                <label class="label">Description</label>
                <div class="control">
                    <input class="input" type="text" name="description" v-model="form.description" placeholder="input Description">
                    <span class="help is-danger" v-if="form.errors.has('description')" v-text="form.errors.get('description')"></span>
                </div>
            </div>
            <div class="control">
                <button class="button is-primary" :disabled="form.errors.any()">Save</button>
            </div>
        </form>

在这里面,介绍几个重点

  • @submit.prevent="onSubmit"调用,我们阻止了表单提交,调用了我们自有的onSubmit函数。
  • @keydown="form.errors.clear($event.target.name)",这个用于输入时清空input框地下的错误提示

app.js
这边分为3个部分,Vue的代码,Form Class,Errors Class

new Vue({
    el: '#app',
    data: {
        form: new Form({
            name: '',
            description:'',
        }),
    },
    methods: {
        onSubmit() {
            this.form.post("/projects")
                .then(data => {
                    alert(data.message);
                })
                .catch(errors => {
                    console.log(errors);
                });

        },
    }
});

我们通过onSubmit调用Form的post函数,可以直接将Form表单中的参数name和description发送到"/projects"

Form Class

class Form {
    constructor(data) {
        this.originalData = data;

        for (let field in data) {
            this[field] = data[field];
        }

        this.errors = new Errors();
    }

    data() {
        let data = {};

        for (let property in this.originalData) {
            data[property] = this[property];
        }
        return data;
    }

    reset() {
        for (let field in this.originalData)
        {
            this[field] = '';
        }

        this.errors.clear();
    }

    submit(requestType,url) {
        return new Promise((resolve,reject) => {
            axios[requestType](url,this.data())
                .then(response => {
                    this.onSuccess(response.data);
                    resolve(response.data);
                })
                .catch(error => {
                    this.onFail(error.response.data.errors);

                    reject(error.response.data.errors);
                });
        });

    }

    onSuccess(data) {
        this.reset();
    }

    onFail(errors) {
        this.errors.record(errors)
    }

    post(url) {
        return this.submit('post',url);
    }
}

constructor为初始化函数,其中this.originalData用于遍历访问field(即name,description).通过for循环赋值,我们可以知道form里面的数据就变成了以下这种情况

this.name = data.name
this.description = data.description

data函数为返回form表单中的数据,data[property] = this[property];其实就是上面这个的反向。
reset函数清空数值,当发布成功后,清空input数值。
submit函数用于提交表单,Promise用来传递异步操作的消息,具体是为了让我们form.post函数能继续调用.then和.catch.

Errors Class

class Errors {
    constructor() {
        this.errors = {};
    }

    get(field) {
        if (this.errors[field])
        {
            return this.errors[field][0];
        }

    }

    has(field) {
        return this.errors.hasOwnProperty(field);
    }

    any() {
        return Object.keys(this.errors).length > 0;
    }

    record(errors) {
        this.errors = errors;
    }

    clear(field) {
        if (field) {
            delete this.errors[field];
            return;
        }

        this.errors = {};

    }
}

errors类通过record将form提交返回的错误信息存入其中,这样我们就可以通过操作这个类,轻松的访问到错误信息。

本作品采用《CC 协议》,转载必须注明作者和本文链接
一入php深似海,从此c++是路人
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

学习了,不过laravel 的validate 如果一个字段多条件的话,就无法全部显示……

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!