I want to toggle a Boolean field value in Firebase 9. I’m using Vue 3
If the value of isFav is true I want to make it false onclick
If the value of isFav is false I want to make it true onclick
It works fine when I set the value of isFav to just false or true. But setting the value as !isFav doesn’t work.
<template>
<!-- books list -->
<div v-for="book in books" :key="book.id" class="book">
<span class="material-icons fav_ico" @click="toggleFav(book.id)">
favorite
</span>
<h2>{{ book.title }} ({{ book.author }})</h2>
<div>
<span class="material-icons done" @click="completeBook"> done </span>
<span class="material-icons" @click="EditBook"> edit </span>
<span class="material-icons delete" @click="deleteBook(book.id)">
delete
</span>
</div>
</div>
</template>
<script setup>
import { ref } from "@vue/reactivity";
import { onMounted, onUnmounted } from "@vue/runtime-core";
import { showBooks, books } from "../use/getBooks.js";
import { doc, deleteDoc, setDoc } from "firebase/firestore";
import { db } from "../firebase/config";
onMounted(() => {
showBooks();
});
function toggleFav(bookid) {
const data = {
isFav: !isFav,
};
const docRef = doc(db, "books", bookid);
setDoc(docRef, data, { merge: true });
}
// Delete a Book
function deleteBook(bookid) {
const docRef = doc(db, "books", bookid);
deleteDoc(docRef);
}
</script>
Console
Uncaught ReferenceError: isFav is not defined
Maybe I’m not reading the value of isFav first. But how can I do that?
Advertisement
Answer
You can pass current value of isFav to toggleFav as shown below:
<span class="material-icons fav_ico" @click="toggleFav(book.id, book.isFav)">
Then use updateDoc() to update the existing document as shown below:
async function toggleFav(bookid, isFav) {
const docRef = doc(db, "books", bookid);
await updateDoc(docRef, { isFav: !isFav });
}