Получение данных из api при наступлении события во Vue.js
Задача: получить и отобразить данные с сервера после отправки формы.
Проблема: код работает корректно при клике мышкой на кнопку найти(submit), при отправке формы по нажатию enter, то запрос выполняется дважды, при этом один успешно, а второй возвращает 404. Данные отображаются вместе с блоком об ошибке. Важна реализация именно во Vue без Vuex. Думал, что задвоение происходит из-за очистки инпута, но не помогло. Возможно это следовало как-то реализовать через lifecycle методы..
Пример кода:
Search.vue
<template>
<div class="container">
<form @submit.prevent="onSubmit">
<input
type="search" placeholder="Укажите город.."
v-model="searchText"
>
<button type="submit">Найти</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
searchText: ''
}
},
methods: {
onSubmit() {
if(this.searchText.trim()) {
this.$emit('search', this.searchText);
this.searchText = '';
}
}
}
}
</script>
App.vue:
<template>
<h1>Прогноз погоды <span class="town-name">{{ town }}</span></h1>
<Search @search="searchTown"/>
<WeatherTable
:forecast='forecast'
v-if="forecast.length > 0"
/>
<p v-if="errored">Упс, ничего не найдено! Попробуйте ввести другой город..</p>
</template>
<script>
import Search from '@/components/Search'
import WeatherTable from '@/components/WeatherTable'
export default {
name: 'App',
data() {
return {
town: '',
forecast: [],
errored: false
}
},
components: {
Search,
WeatherTable
},
methods: {
async searchTown(searchText) {
this.town = searchText;
await fetch(`http://api.openweathermap.org/data/2.5/forecast?q=${searchText}&units=metric&cnt=10&lang=ru&appid=мойId`)
.then(res => {
if (res.status === 200 || res.status === 201) {
this.errored = false;
res.json()
.then(json => this.forecast = json.list);
} else {
console.log (res.status);
this.errored = true;
this.forecast = [];
return;
}
})
}
}
};
</script>
Ответы (1 шт):
Автор решения: Ruslan
→ Ссылка
Нашел ошибку, указал некорректный type в инпуте, нужно было оставить type='text' , а я написал type='search'