Я пытался сделать это в соответствии с рекомендациями, но я не смог сделать это хорошо.
Однако я попытался придумать альтернативные способы сделать это.
Мне это показалось интересным (хотя, возможно, это не имеет смысла, по какой-то причине я не знаю).
1) добавлено «upvoted: false» к элементу при создании
2) добавлены два метода (один для голосования, другой для понижения голосов)
methods: {
upvoteItem(itemId, upvotes) {
let docId = `${this.currentUser.uid}_${itemId}`
fb.upvotesCollection.doc(docId).get().then(doc => {
if (doc.exists) { return }
fb.upvotesCollection.doc(docId).set({
itemId: itemId,
userId: this.currentUser.uid
}).then(() => {
fb.itemsCollection.doc(itemId).update({
upvotes: upvotes + 1,
upvoted: false
})
})
}).catch(err => {
console.log(err)
})
},
downvoteItem(itemId, upvotes) {
let docId = `${this.currentUser.uid}_${itemId}`
fb.upvotesCollection.doc(docId).get().then(doc => {
if (doc.exists) { return }
fb.upvotesCollection.doc(docId).set({
itemId: itemId,
userId: this.currentUser.uid
}).then(() => {
fb.itemCollection.doc(itemId).update({
upvotes: upvotes - 1,
upvoted: true
})
})
}).catch(err => {
console.log(err)
})
},
3) троичный оператор по нажатию
<button @click="item.upvoted ? downvoteItem(item.id, item.upvotes) : upvoteItem(item.id, item.upvotes)">{{ item.upvotes }}</button>
Но троичный оператор работает только с первым щелчком, я не могу заставить работать второй!