Я хочу переключить логическое значение поля в Firebase 9. Я использую Vue 3
Если значение isFav равно true, я хочу сделать это false по клику
Если значение isFav равно false, я хочу сделать это true по клику
Он отлично работает, когда я устанавливаю значение isFav просто false или true. Но установка значения как !isFav не работает.
<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>
Консоль
Uncaught ReferenceError: isFav не определен
Может быть, я не читаю значение isFav в первую очередь. Но как я могу это сделать?
Пожалуйста, edit свой вопрос и добавьте свой полный код, чтобы мы могли видеть, откуда берется существующее значение isfav.
Привет, спасибо за быстрый ответ. Я добавил код Vue.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете передать текущее значение isFav в toggleFav, как показано ниже:
<span class = "material-icons fav_ico" @click = "toggleFav(book.id, book.isFav)">
Затем используйте updateDoc(), чтобы обновить существующий документ, как показано ниже:
async function toggleFav(bookid, isFav) {
const docRef = doc(db, "books", bookid);
await updateDoc(docRef, { isFav: !isFav });
}
Привет, спасибо за ответ. Я использовал setDoc, и он отлично работает. UpdateDoc лучше, чем setDoc?
@meawcoding updateDoc() предназначен для обновления существующих документов. setDoc({}, { merge: true }) обычно используется для операций upsert, когда вы хотите создать документы, если они не существуют, или просто обновить, если они существуют.
должна быть ссылка на
isFav, откуда вы это взяли. попробуйте использовать isFav в объекте данных.