VueJS: вычисляемое свойство вычисляется до создания в компоненте?
У меня есть компонент, который выглядит так:
export default {
name: 'todos',
props: ['id'],
created () {
this.fetchData()
},
data() {
return {
}
},
computed: {
todos () {
return this.$store.state.todos[this.id]
}
},
methods: {
async fetchData () {
if (!this.$store.state.todos.hasOwnProperty(this.id)) {
await this.$store.dispatch('getToDos', this.id)
}
}
}
}
Вот что происходит:
- Компонент получает
id
с помощью реквизита.
Когда компонент загружается, мне нужно получить некоторые данные на основе идентификатора
у меня есть
created()
крюк, откуда я вызываю функциюfetchData()
чтобы получить данные.В методах
fetchData()
Функция отправляет действие для получения данных. Это получает и сохраняет данные в магазине Vuex.Вычисляемая собственность
todos
получает данные для этого идентификатора.
Проблема в том, что при первой загрузке страницы вычисляемое свойство todos
отображается как неопределенный. Если я изменю страницу (на стороне клиента), то вычисленное свойство получает правильные данные из хранилища и отображает их.
Я не могу понять, почему вычисляемое свойство не обновляется?
3 ответа
Вы можете использовать следующий подход:
component.vue (и просто сделать todoItem
)
methods: {
async fetchData () {
const _this = this;
if (!this.$store.state.todos.hasOwnProperty(this.id)) {
this.$store.dispatch('getToDos', {id: this.id, callback: () => {
_this.todoItem = _this.$store.state.todos[_this.id]
}});
}
}
}
store.js
actions: {
getToDos: (context, payload) => {
// simulate fetching externally
setTimeout(() => {
context.commit("getToDos__", {newId: payload.id, task: "whatever" });
payload.callback();
}, 2000);
},
База здесь
При вызове этого хука настраиваются следующие параметры: реактивные данные, вычисляемые свойства, методы и наблюдатели. Однако этап монтирования еще не начался, и свойство $el еще не будет доступно.
Я думаю, что это может решить, если вы создаете геттер для todos
,
Так что в вашем магазине VueX добавьте:
getters: {
todos(state) {
return state.todos;
}
};
А чем по вашему computed
использовать:
computed: {
todos () {
return this.$store.getters.todos[this.id]
}
}