Проблема
✅ Vue 2: вычисляемые свойства обновляются после изменения хранилища vuex.
❌ Vue 3: вычисляемые свойства не обновляются после изменения хранилища vuex.
Векс 4
Цель: получать публикации из Firestore. Добавить в массив сообщений. Совершить мутацию.
Примечание. Функция getNextPosts вызывается из (работающего) наблюдателя пересечения, который допускает бесконечную прокрутку.
const postsArray: Array<string> = [];
const vuexStore = createStore({
state: {
posts: []
},
actions: {
// See https://firebase.google.com/docs/firestore/query-data/query-cursors#paginate_a_query
getFirstPosts({ commit }) {
const getFirstPosts = async () => {
const firstPostsQuery = firestore.collection("posts").limit(3);
// Get FIRST posts.
const firstPosts = await firstPostsQuery.get();
// Add to postsArray.
for (const doc of firstPosts.docs) {
postsArray.push(doc.id);
}
// Add to vuex store.
commit("addFirstPostsToVuex", postsArray);
// Set reference.
lastPostDownloaded = firstPosts.docs[2]; // 3rd post.
};
getFirstPosts();
},
getNextPosts({ commit }) {
const getNextPosts = async () => {
const nextPostsQuery = firestore
.collection("posts")
.startAfter(lastPostDownloaded)
.limit(2);
// Get NEXT posts.
const nextPosts = await nextPostsQuery.get();
// Add to postsArray.
for (const doc of nextPosts.docs) {
postsArray.push(doc.id);
}
// Add to vuex store.
commit("addNextPostsToVuex", postsArray);
// Update reference.
lastPostDownloaded = nextPosts.docs[1]; // 2nd post.
};
getNextPosts();
}
},
mutations: {
addFirstPostsToVuex(state, value) {
state.posts = value;
},
addNextPostsToVuex(state, value) {
state.posts = value;
}
}
});
Вычисляемые свойства
export default ({
computed: {
posts() {
// List rendering.
return vuexStore.state.posts;
}
}
});
v-для
<template>
<div id="feed">
<article class="post" v-for="post in posts" v-bind:key="post.id">
<header class="info">
{{ post }}
</header>
</article>
</div>
</template>