如何使用 VueJs 和 Laravel 5 在输入上使用

琼杰

我按照本教程进行操作,效果很好。但我想要的是不使用submit按钮来检查或执行验证,我想要的是在我打字时,它现在正在验证表单。请参阅下面的代码,或访问我上面提到的链接。

代码:

路线

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::get('/article/create', 'ArticleController@showArticleCreationForm');
Route::post('/article', 'ArticleController@publish');



文章控制器

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ArticleController extends Controller
{
    public function showArticleCreationForm(){
        return view('article.create');
    }

    public function publish(Request $request){
        $this->validate($request, [
            'title' => 'required|min:3',
            'body' => 'required|min:10'
        ]);
        if ($request->ajax()) return;

        return 'publish';
    }
}



创建.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Create Article</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-7s5uDGW3AHqw6xtJmNNtr+OBRJUlgkNJEo78P4b0yRw= sha512-nNo+yCHEyn0smMxSswnf/OnX6/KwJuZTlNZBjauKhTK0c+zT+q5JOCx0UFhXQ6rJR9jg6Es8gPuD2uZcYDLqSw==" crossorigin="anonymous">
    <style>
        .body {
            height: 200px !important;
        }

        .error {
            color: darkred;
            margin-top: 5px;
            display: block;
        }
   </style>
</head>
<body id="app">
    <form @submit.prevent="submitForm" class="col-md-4 col-md-offset-4" action="{{ URL::to('/') }}/article" method="post">
        <h1>Create New Article</h1>
        <hr>

        {!! csrf_field() !!}

        <div class="form-group">
            <input class="form-control title" type="text" name="title" placeholder="Title" v-model="formInputs.title">
            <span v-if="formErrors['title']" class="error">@{{ formErrors['title'] }}</span>
        </div>

        <div class="form-group">
            <textarea class="form-control body" name="body" placeholder="Content" v-model="formInputs.body"></textarea>
            <span v-if="formErrors['body']" class="error">@{{ formErrors['body'] }}</span>
        </div>

        <button class="btn btn-primary" type="submit">Publish</button>
    </form>


<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.14/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-resource/0.6.1/vue-resource.min.js"></script>
<script>
    new Vue({
        el: '#app',

        data: {
            formInputs: {},
            formErrors: {}
        },

        methods: {
            submitForm: function(e){
                var form = e.target;
                var action = form.action;
                var csrfToken = form.querySelector('input[name="_token"]').value;

                this.$http.post(action, this.formInputs, {
                  headers: {
                      'X-CSRF-TOKEN': csrfToken
                  }
                })
                .then(function() {
                      form.submit();
                })
                .catch(function (data, status, request) {
                  var errors = data.data;
                  this.formErrors = errors;
                });
            }
        }
    });
</script>
</body>
</html>
伪经

如果你想在输入时进行验证,你应该在你的输入上添加一个@keyup(或v-on:keyup)事件侦听器并在它被触发时进行验证,例如:

<input class="form-control title" type="text" name="title" placeholder="Title" v-model="formInputs.title" v-on:keyup="validate">

和您的事件侦听器:

 methods: {
      validate: function (e) {
            //e.target would have the target input which is being changed 

            _.debounce(function () {
                    var input = e.target;
                    var form = input.form;
                    var action = form.action; 
                    var csrfToken = form.querySelector('input[name="_token"]').value;

                    this.$http.post(action, this.formInputs, {
                    headers: {
                        'X-CSRF-TOKEN': csrfToken
                    }
                 })
                .then(function() {
                      // Don't submit
                 })
                .catch(function (data, status, request) {
                    var errors = data.data;
                    this.formErrors = errors;
                });

            }.bind(this), 500); 
      }

这个例子使用_.debouncewhich 是一个 lodash 函数,但你可以很容易地通过setTimeoutand自己编写类似的东西cancelTimeout(lodash 只是为了方便)。目的是不是在每个 keyup 上触发验证,而是将它分散一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Vuejs和Laravel 5的多维表单数组

使用 Laravel、VueJS 和 Inertiajs 导出 Excel

使用VueJs和Laravel上传多个文件

使用VueJS,axios和Laravel上传文件

使用axios vuejs和laravel验证表单

如何使用laravel和vuejs下载文件

如何在 laravel 項目中的 VueJS 上使用 Font Awesome 5

如何在Vuejs的CKEditor 5上激活和/或安装插件

Vuejs和Laravel:如何使用http get将数组传递给Laravel控制器

使用laravel-dompdf和vuejs前端下载PDF

与laravel和vuejs2一起使用道具

使用vuejs和laravel上载不带表单的文件

使用VueJS和Laravel的Textarea v模型初始值

使用 Laravel 8 和 VueJS 2 中的 Marked 解析 Markdown

如何在Laravel 5中同时使用orderBy和Paginate

如何使用Vuejs和Laravel获取当前经过身份验证的用户ID?

如何使用VueJS和axios在Laravel中填充从API提取的数据到select选项?

如何使用 Axios 和 VueJS 捕获所有 Laravel API 错误?

如何使用 Laravel 和 Vuejs 一次更新更多表行?

TDD和Laravel 5中View的使用

如何使用vuejs过滤laravel api分页

如何使用Laravel在VueJS中分配值?

如何使用VueJS(+ Laravel)自动显示模态

如何使用 vuejs 和 tailwindcss 配置电子

如何连接或使用NDK和Nativescript vuejs

如何使用VueJS和ChartJS更新图表

使用Composer和Laravel 5安装Laravel Collection

如何在Laravel 5中使用输入名称创建存储文件夹和子文件夹

使用Laravel和VueJS配置完全分离的前端和后端Web应用程序