Отправка формы в Vue.js с помощью ajax
Я действительно зациклился на том, как я буду работать с отправкой формы, которая делает запрос ajax, используя Vue.js и vue-resource, а затем используя ответ для заполнения 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() !!}
вю /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?
Просто подведем итог всему:
- Как мне отправить форму с помощью vue js и vue-resource вместо обычного jQuery?
- Используя ответ от ajax, как я могу выводить данные в div, предпочтительно используя компоненты?
Любая помощь по этому поводу была бы очень признательна, спасибо.
Ответы
Ответ 1
Чтобы получить значение от ввода, вам необходимо использовать директиву v-model
1. Blade View
<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>
Если вы хотите передать данные компоненту, используйте "реквизиты" для просмотра дополнительных документов
http://vuejs.org/guide/components.html#Passing_Data_with_Props
Если вы хотите использовать laravel и vuejs вместе, то checkout
https://laracasts.com/series/learning-vuejs
Я надеюсь, что это будет полезно для вас!
Ответ 2
-
Добавьте v-model="id"
в свой текстовый ввод
-
затем добавьте его в объект данных
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);
}
);
}
}
});
-
Возможно, лучше удалить v-on="click: search"
и добавить v-on="submit: search"
в тег формы.
- Вы должны добавить
method="GET"
в свою html-форму.
- Убедитесь, что в вашем html-коде есть
#someId
.
Ответ 3
Я использовал этот подход и работал как шарм:
event.preventDefault();
let formData = new FormData(event.target);
formData.forEach((key, value) => console.log(value, key));