web-dev-qa-db-ja.com

Aueを使用してVue.jsでフォームを送信する

Vue.jsとvue-resourceを使用してajaxリクエストを作成し、そのレスポンスを使用してdivを埋めるフォームを送信する方法に本当に固執しています。

私はこのようにjs/jQueryを使用してプロジェクトからプロジェクトにこれを行います:

ブレードで表示

{!! Form::open(['route' => 'formRoute', 'id' => 'searchForm', 'class' => 'form-inline']) !!}
    <div class="form-group">
        <input type="text" name="id" class="form-control" placeholder="id" required="required">
    </div>
    <button type="submit" class="btn btn-default">Search</button>
{!! Form::close() !!}

js/jquery

var $searchForm = $('#searchForm');
var $searchResult = $('#searchResult');

$searchForm.submit(function(e) {
    e.preventDefault() ;

    $.get(
        $searchForm.attr('action'),
        $searchForm.serialize(),
        function(data) {
            $searchResult.html(data['status']);
        }
    );
});

これまでにVue.jsで行ったこと/試したこと:

ブレードで表示

{!! Form::open(['route' => 'formRoute', 'id' => 'searchForm', 'class' => 'form-inline']) !!}
    <div class="form-group">
        <input type="text" name="id" class="form-control" placeholder="id" required="required">
    </div>
    <button type="submit" class="btn btn-default" v-on="click: search">Search</button>
{!! Form::close() !!}

vue/js

    Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('value');

    new Vue({
        el: '#someId',

        data: {

        },

        methods: {
            search: function(e) {
                e.preventDefault();

                var req = this.$http.get(
                    // ???, // url
                    // ???, // data
                    function (data, status, request) {
                        console.log(data);
                    }
                );
            }
        }
    });

応答を処理するときにコンポーネントを使用して、応答データをdivに出力できるかどうか疑問に思っていますか?

すべてを要約するだけです:

  1. 通常のjQueryの代わりにvue jsとvue-resourceを使用してフォームを送信するにはどうすればよいですか?
  2. Ajaxからの応答を使用して、できればコンポーネントを使用してdivにデータを出力するにはどうすればよいですか?

これに関するどんな助けでも、感謝されます。

15
haakym
  1. テキスト入力にv-model="id"を追加します

  2. それをデータオブジェクトに追加します

    new Vue({
        el: '#someId',
    
        data: {
            id: ''
        },
    
        methods: {
            search: function(e) {
                e.preventDefault();
    
                var req = this.$http.get(
                    '/api/search?id=' + this.id,
                    function (data, status, request) {
                        console.log(data);
                    }
                );
            }
        }
    });
    
  3. Formタグにv-on="click: search"を削除し、v-on="submit: search"を追加することをお勧めします。

  4. フォームにmethod="GET"を追加する必要があります。
  5. HTMLマークアップに#someIdがあることを確認してください。
7

入力から値を取得するには、v-modelディレクティブを使用する必要があります

1。ブレードビュー

<div id="app">
<form v-on="submit: search">
    <div class="form-group">
        <input type="text" v-model="id" class="form-control" placeholder="id" required="required">
    </div>

    <input type="submit" class="btn btn-default" value="Search">
</form>
</div>

<script type="text/javascript">

// get route url with blade 
var url = "{{route('formRoute')}}";

Vue.http.headers.common['X-CSRF-TOKEN'] = document.querySelector('#token').getAttribute('value');


var app = new Vue({
    el: '#app',
    data: {
        id: '',
        response: null
    },
    methods: {
        search: function(event) {
            event.preventDefault();

            var payload = {id: this.id};

            // send get request
            this.$http.get(url, payload, function (data, status, request) {

            // set data on vm
            this.response = data;

            }).error(function (data, status, request) {
                // handle error
            });
        }
    }
});
</script>

コンポーネントにデータを渡したい場合は、「props」を使用して詳細をドキュメントを参照してください

http://vuejs.org/guide/components.html#Passing_Data_with_Props

laravelとvuejsを一緒に使用する場合は、チェックアウト

https://laracasts.com/series/learning-vuejs

これがお役に立てば幸いです!

6
Anish Dcruz

私はこのアプローチを使用し、魅力のように働きました:

event.preventDefault();

let formData = new FormData(event.target);

formData.forEach((key, value) => console.log(value, key));
6
scrubmx