VueJS получает данные до рендеринга шаблона

1

У меня есть компонент 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. Таким образом, шаблон отображается только при загрузке всех фильтров. Есть ли лучший способ, может быть, через обещания?

  • 1
    Решение, которое вы предлагаете в своем вопросе (установка filter на false ), должно работать, почему вы не попробовали его?
  • 0
    Только что отредактировал вопрос ^^ но спасибо за ваш ответ!
Показать ещё 3 комментария
Теги:
vue.js
promise

1 ответ

0

Ваше существующее решение неплохое. В целом, ваш рендеринг шаблонов не должен быть связан с извлечением данных - рассмотрим случай, когда сервер занимает много времени, чтобы ответить или хуже, по какой-то причине совершенно недоступен. В этом случае вы должны показать хотя бы прядильщик.

Таким образом, это означает, что любая логика отображения есть, это должно быть сделано "вручную" и не должно быть связано с жизненным циклом 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();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню