javascript - 我可以使用 Options API 更新数据,但不能使用 Composition API
问题描述
所以,我想编辑一些存储在我的 NoSQL 数据库中的数据,在本例中是 Firebase。
使用 Vue2 中的 Options API 这样做没有问题
<template>
<div class="header"><h2>Edit Top Image</h2></div>
<div v-if="content">
<form class="wysiwyg-form" @submit.prevent="handleEditText">
<Editor v-model="content.hotelDescription" class="editorStyle" />
<button class="update-btn">Update</button>
</form>
</div>
</template>
<script>
import projectFirestore from '@/firebase/config'
export default {
data() {
return {
content: null
}
},
methods: {
handleEditText() {
projectFirestore.collection('hotel_section').doc(this.content.id).update({
hotelDescription: this.content.hotelDescription
}).then(() => {
this.$router.push({ name: 'Hotel' })
}).catch(err => {
console.log(err)
})
}
},
created() {
let ref = projectFirestore.collection("hotel_section").doc(this.$route.params.id);
ref.get().then((doc) => {
this.content = doc.data();
this.content.id = doc.id;
});
}
}
</script>
但我想使用 Vue3 和组合 API 来完成同样的任务,但它不起作用。我在控制台中没有收到任何错误。数据只是没有显示。我需要重写什么才能完成这项工作?
<template>
<div class="header"><h2>Edit Top Image</h2></div>
<div v-if="content" class="Hotel-Section-Edit">
<div class="header"><h2>Edit Hotel Information</h2></div>
<form class="wysiwyg-form" @submit.prevent="handleSubmit">
<div class="error">{{ fileError }}</div>
<Editor v-model="content.hotelDescription" placeholder="Change hotel description" class="editorStyle"/>
<button class="update-btn" v-if="!isPending">Update</button>
<button class="update-btn" v-else disabled>Updating...</button>
</form>
</div>
</template>
<script>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import useDocument from '@/composables/useDocument'
import useCollection from '@/composables/useCollection'
export default {
props: ['content'],
setup(props) {
const content = ref('')
const file = ref(null)
const fileError = ref(null)
const { error } = useCollection()
const isPending = ref(false)
const router = useRouter();
const handleSubmit = async () => {
if (!props.content) return
const { updateDoc } = useDocument('hotel_section', props.content.id)
await updateDoc({
hotelDescription: hotelDescription.value,
})
isPending.value = false
if(!error.value) {
router.push({ name: "Hotel" })
}
}
return {
content,
handleSubmit,
fileError,
isPending,
error,
file
}
}
}
</script>
以下是为 Vue3 解决方案导入的脚本。
使用文档.js
import { ref } from 'vue'
import { projectFirestore } from '../firebase/config'
const useDocument = (collection, id) => {
const error = ref(null)
const isPending = ref(false)
let docRef = projectFirestore.collection(collection).doc(id)
const deleteDoc = async () => {
isPending.value = true
error.value = null
try {
const res = await docRef.delete()
isPending.value = false
return res
}catch(err) {
console.log(err.message)
isPending.value = false
error.value = 'Could not delete document'
}
}
const updateDoc = async (updates) => {
isPending.value = true
error.value = null
try {
const res = await docRef.update(updates)
isPending.value = false
return res
}catch(err) {
console.log(err.message)
isPending.value = false
error.value = 'Could not update document'
}
}
return {
error,
isPending,
deleteDoc,
updateDoc
}
}
export default useDocument
useCollection.js
import { ref } from 'vue'
import { projectFirestore } from '../firebase/config'
const useCollection = (collection) => {
const error = ref(null)
const isPending = ref(false)
const addDoc = async (doc) => {
error.value = null
isPending.value = true
try {
await projectFirestore.collection(collection).add(doc)
isPending.value = false
} catch(err) {
console.log(err.message)
error.value = 'Error getting collection'
isPending.value = false
}
}
return {
error,
addDoc,
isPending
}
}
export default useCollection
解决方案
推荐阅读
- javascript - 如何在 JavaScript 中使用 CDK 将资源策略添加到现有 S3 存储桶?
- c# - WPF 中的井字游戏 GUI
- jquery - Jquery - 查找包含具有给定文本值的特定类的类的 div
- angular - 取消订阅 location.onUrlChange()
- c++ - C++ 结构冒泡排序
- sas - SAS:数据集合并并打印出完整的变量列表,但找不到供将来使用的变量
- sql - SQL 子查询:显示购买了两件商品的 Customer_ID
- mysql - 在sql中合并具有不同行数的2个不同列后,如何使重复值变为null?
- r - 在 R Markdown 中,如何使用超链接创建对引用的引用?
- javascript - 如何检查作为字符串带来的变量是否是 Javascript 中的数字或字母?