Vue.js component render и axios

388
24 сентября 2017, 01:08

К примеру есть компонент

Vue.component('News', {
        props: {
            data: {
                type: Object,
                default: function() {
                    return {
                        items: []
                    }
                }
            }
        },
        created() {
            console.log('created');
            return axios.get('/news/items')
                .then((response) => {
                    console.log('data fetched');
                    this.data = response.data.News;
                })
                .catch(function(error) {
                    return Promise.reject(error.status);
                });
        },
        render: function(createElement) {
            console.log('render');
            console.log(this.data.items);
        }
    });

Выполнив данный код получим:

created
render
undefined //console.log(this.data.items);
data fetched
render
(6) [{…}, {…}, {…}, {…}, {…}, {…}, __ob__: io] //console.log(this.data.items);

Рендер отработал дважды, первый раз не дожидаясь данные от ajax запроса. Так собственно как заставить отработать его только после получения этих самых данных ? Т.е. чтобы стало так:

created
data fetched
render
Answer 1

Т.к. это компонент лучше все данные передовать в нутри компонента в

props:{}

а не

data(){}

created(),mounted() и другие - будут вызывать все методы, которые завязаны на "цикле жизни" экземпляра -> компонента при его изменении, монитровании и т.д, и описанные в его "теле".

потому, лучше используйте

computed: {}

Пример:

Vue.component('News', {
data() {
    return {
        items: []
    }
},
computed: {
    getNews(){
        return axios.get('/news/items')
            .then((response) => {
                return response.data.News.items;
            })
            .catch(function(error) {
                return Promise.reject(error.status);
            });   
    }
},
render: function(createElement) {
    console.log('render');
}

});

И в нутри тела нужного тега делаем манипуляцию

<div v-for="(item, index) in getNews"> {{ item }}</div>

READ ALSO
Ошибка в JavaScript (Uncaught Error)

Ошибка в JavaScript (Uncaught Error)

Что делать с данной ошибкой ?

440
Вопрос по созданию бота

Вопрос по созданию бота

Заинтересовалась тема ботовМожно ли на JS написать например instagram-бота? Функции спама в сообщениях не интересуют

217
Как найти код, который выполняет JS? [дубликат]

Как найти код, который выполняет JS? [дубликат]

На данный вопрос уже ответили:

229
Таблица на JS, как подсветить столбец?

Таблица на JS, как подсветить столбец?

Есть табличка, нужно при наведении курсора, чтобы подсвечивало столбец и строкуСо строкой получилось, помогите, пожалуйста, подсветить и столбец

341