我正在基于Medium发布的教程构建Vue.js待办事项列表CRUD应用程序:(第1部分)https://medium.com/@magyarn/vuefire-crud-todo-list-app-part-1-e069c46b50c6,(第2部分)https://medium.com/@magyarn/vuefire-crud-todo-list-app-part-2-8bd61ae0d066
我完全构建了该应用程序,并成功将其连接到Firestore数据库。但是,似乎没有办法在将列表项添加到数据库后在DOM上呈现它们。换句话说,将列表项添加到数据库后,我必须单击浏览器刷新按钮以查看屏幕上的列表项。为了解决这个问题,我在每个方法中都添加了window.location.reload以在每次单击添加,编辑或删除时自动触发页面重新加载,但这似乎不是一个好的长期解决方案。这是一个例子:
addTodo() {
todosCollection.add({
text: this.newTodo,
completed: false,
id: this.todos.length,
createdAt: new Date()
})
.then(() => {
window.location.reload()
})
deleteTodo(todo) {
todosCollection.doc(todo.id).delete()
.then(() => {
window.location.reload()
})
},
我还添加了一个特殊的钩子,以便在手动刷新后检索数据库中的项目并将其呈现给DOM:
methods: {
...
},
created(){
todosCollection.get()
.then(snapshot => {
snapshot.forEach(doc => {
let newTodo = doc.data()
newTodo.id = doc.id
this.todos.push(newTodo)
})
})
}
我的问题是,对于这种单页Vue.js应用程序,无需重新加载即可处理刷新的最佳方法是什么?谢谢!
最佳答案
有几种方法可以做到:
方法1:
使用Vuefire绑定
在创建的列表中删除获取列表,并将以下代码添加到您的组件中:
firestore() {
return {
todos: todosCollection.orderBy('createdAt', 'desc')
}
},
Vuefire document
方法2:
手动更新您的列表。首先,将数据分别获取到方法中,并在每个操作之后在
created
挂钩中调用它created() {
this.getData()
},
methods: {
getData() {
const todos = []
todosCollection.get()
.then(snapshot => {
snapshot.forEach(doc => {
let newTodo = doc.data()
newTodo.id = doc.id
todos.push(newTodo)
})
this.todos = todos
})
},
addTodo() {
todosCollection.add({
text: this.newTodo,
completed: false,
id: this.todos.length,
createdAt: new Date()
})
.then(() => {
this.getData()
})
},
deleteTodo(todo) {
todosCollection.doc(todo.id).delete()
.then(() => {
this.getData()
})
},
}