У меня есть компонент vue, который должен отображать и обрабатывать параметры фильтра для результатов, показанных на сайте.
В приведенном ниже коде показана часть моего компонента. В этом примере пользователь может установить минимальную и максимальную цену. Поскольку мой фильтр обрабатывается бэкэнд, я хочу получить всю доступную опцию фильтра (или фильтры по умолчанию) до визуализации компонента.
К сожалению, я получаю следующее сообщение об ошибке: TypeError: Не удается прочитать свойство "мин" неопределенного.
СОСТАВНАЯ ЧАСТЬ
<template>
<div id="filter">
<fieldset>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">Preis von - bis</span>
</div>
<select class="form-control" id="min_price" v-model="filter.price.min"
v-on:change="countResults">
<option value="0" selected="selected">beliebig</option>
<option value="250">250 €</option>
<option value="500">500 €</option>
<option value="750">750 €</option>
<option value="1000">1000 €</option>
<option value="1500">1500 €</option>
</select>
<select class="form-control" id="max_price" v-model="filter.price.max"
v-on:change="countResults">
<option value="250">250 €</option>
<option value="500">500 €</option>
<option value="750">750 €</option>
<option value="1000">1000 €</option>
<option value="1500">1500 €</option>
<option value="0" selected="selected">beliebig</option>
</select>
</div>
</fieldset>
</div>
</template>
JS
<script>
export default {
name: "VehicleFilterComponent",
data: function () {
return {
categories: [],
filter: {}
}
},
methods: {
getDefaultFilter() {
axios.get(this.$apiUrl + '/vehicles/default-filters')
.then(result => {
this.filter = result.data.filter;
}).catch(function (error) {
console.warn(error)
});
}
},
beforeMount() {
this.getDefaultFilter();
}
}
</script>
Есть ли способ подождать, пока все фильтры будут загружены?
Сейчас я использую v-if
и устанавливаю для данных фильтра по умолчанию значение false. Таким образом, шаблон отображается только при загрузке всех фильтров. Есть ли лучший способ, может быть, через обещания?
Ваше существующее решение неплохое. В целом, ваш рендеринг шаблонов не должен быть связан с извлечением данных - рассмотрим случай, когда сервер занимает много времени, чтобы ответить или хуже, по какой-то причине совершенно недоступен. В этом случае вы должны показать хотя бы прядильщик.
Таким образом, это означает, что любая логика отображения есть, это должно быть сделано "вручную" и не должно быть связано с жизненным циклом Vue, то есть с v-if
и т.д.
Что касается самого кода, вы можете сделать его более понятным с синтаксисом async
/await
:
export default {
name: "VehicleFilterComponent",
data: function () {
return {
categories: [],
filter: {}
}
},
methods: {
async getDefaultFilter() {
this.filter = (await axios.get(this.$apiUrl + '/vehicles/default-filters')).data.filter;
}
},
beforeMount() {
this.getDefaultFilter();
}
}
filter
наfalse
), должно работать, почему вы не попробовали его?