Это проблема времени.
Вам нужно будет понять асинхронную природу Javascript ./
Когда вы делаете document.querySelectorAll('frame.ajax .ajax-body > ol > li')
в смонтированном хуке, запрос ajax, вероятно, еще не ответил.Поэтому элементы DOM еще не существуют , и они не работают должным образом.
Мое предложение состоит в том, чтобы поместить коды для манипуляции DOM в метод и вызвать его после того, как запрос ajax
См. listManipulation
метод:
var tcnt = 0;
new Vue({
el: '#app',
data: {
posts: []
},
created() {
axios.get('http://www.just-a-wp-site.com/wp-json/wp/v2/categories/')
.then((response) => {
var categoryId = 0;
response.data.forEach(function(category) {
if (category.slug == 'announcements') {
categoryId = category.id;
console.log('Category ID: ' + category.id);
}
});
return categoryId;
})
.then((categoryId) => {
console.log(categoryId);
return axios.get('http://www.just-a-wp-site.com/wp-json/wp/v2/posts/', {
params: {
categories: categoryId,
per_page: 1,
status: 'publish'
}
});
})
.then((response) => {
console.log(response.data);
this.posts = response.data;
this.$nextTick(() => {
this.listManipulation();
})
})
.catch((error) => {
console.log(error.message);
})
},
methods: {
listManipulation() {
var announcements = document.querySelectorAll('frame.ajax .ajax-body > ol > li');
console.log(announcements.length);
setInterval(function() {
var target = announcements.length % tcnt;
for (i = 0; i < announcements.length; i++) {
if (i == target) {
announcements[i].style.display = 'block';
} else {
announcements[i].style.display = 'initial';
}
}
tcnt++;
}, 1000);
}
}
});
$ nextTick означает, что сначала нужно обновить DOM, а затем выполнить код внутри.
Также считается плохой практикой манипулировать DOM напрямую в проекте Vue.Потому что Vue отслеживает изменения DOM, используя Virtual DOM.Если вы измените DOM, Vue не будет отслеживать это и может перезаписать модификацию при следующем обновлении.
Поскольку вы управляете дисплеем, вам следует проверить v-if