Я новичок в Vue, а совсем недавно в Vuex и пытаюсь выяснить, как изменить конкретный пост в глобальном состоянии с помощью vuex после того, как действие было совершено.
Вот пример государства.
// Array of posts
[
{
id: 1,
body: "This is an example post",
comments: [
{ id: 1, body: "This is a comment" }
]
},
{
id: 2,
body: "This is an example post 2",
comments: [
{ id: 1, body: "This is a comment 2" }
]
},
{
id: 3,
body: "This is an example post 3",
comments: [
{ id: 1, body: "This is a comment 3" }
]
},
]
И вот действие, которое я разработал, чтобы добавить новый комментарий. Комментарий успешно создается в базе данных, но я не могу найти способ поместить комментарий в правильную часть состояния, поскольку пытаюсь изменить дочернее свойство.
const actions = {
async new_post() {
...
},
async new_comment({ commit }, data) {
const response = await axios.post(
'http://localhost:3000/api/posts/' + data.id + '/comments/new', {
body: data.body
}
);
commit('new_comment', {
res: response.data, // The object (comment) I want to push into a specific post
id: data.id, // The id of the post I want to push the comment into
})
}
}
const mutations = {
new_comment: (state, incoming) => {
state.posts.filter(post => post._id === incoming.id) // Is the post I want to update
console.info(incoming.res) // The object I want to update the post.comments with.
}
}
Есть идеи?
Вы можете попробовать изменить «Массив объектов» на и «Объект объектов» и присвоить каждому объекту ключ следующим образом:
{
1: {
.....
},
2: {
.....
}
....
}
затем вы можете добавлять к ним объекты, вызывая их по их ключ, которые должны совпадать с я бы.
Вы можете добиться этого, используя карту.
Попробуйте этот код.
state.posts = state.posts.map(function (post) {
if (post.id === incoming.id) {
return incoming
}
return item
})