【发布时间】:2019-07-19 22:16:28
【问题描述】:
我有以下设置
Component.vue(将数据库集合显示为主页中的网格)
...
<v-flex v-for="i in items" :key="i.id" xs6 sm3 md3>
<v-card color="primary">
<v-card-text>
<h2
class="font-weight-regular mb-4"
>
{{ i.description }}
</h2>
</v-card-text>
</v-card>
</v-flex>
...
<script>
import { db } from '~/plugins/firebase.js'
export default {
data: () => ({
items: []
}),
props: ['reload'],
watch: {
reload: function (newVal, oldVal) {
this.items = items
alert('changed reload')
}
},
methods: {
firestore() {
db.collection('items')
.get()
.then(querySnapshot => {
const items = []
querySnapshot.forEach(function(doc) {
const item = doc.data()
item.id = doc.id
items.push(useritem)
})
this.items = items
})
.catch(function(error) {
alert('Error getting documents: ' + error)
})
}
}
}
</script>
index.vue(具有网格组件和添加新集合的按钮的主页)
....
<v-layout mb-4>
<v-btn
@click="submit"
>
Add Item
</v-btn>
</v-layout>
<v-layout mb-4>
<component :reload="reload" />
</v-layout>
....
<script>
import { db } from '~/plugins/firebase.js'
import component from '~/components/Component.vue'
import moment from 'moment'
export default {
components: {
component
},
data() {
return {
description: 'test',
date: moment(),
reload: false
}
},
methods: {
submit() {
db.collection('items')
.add({
description: this.description,
deadline: new Date(moment(this.date)),
status: true
})
.then(docRef => {
this.reload = true
})
.catch(error => {
alert('Error adding document: ', error)
})
}
}
}
</script>
可以看出,我在组件中添加了一个道具,以便在使用按钮在主页上添加新项目时触发从数据库重新加载数据。
成功插入后,值会从 false 变为 true。但是,组件网格不会重新加载。刷新页面会在网格中显示新项目。
如何在添加新项目时使组件反应或触发重新加载?
【问题讨论】:
-
我希望您在
watch中为reload调用函数firestore()。 -
@vahdet 谢谢,我已经尝试过了,但无济于事。无论如何,我至少应该看到手表中的警报被触发。这也不会发生
-
你的陈述Onsuccessful insert the value changes from false to true让我觉得警报触发成功了,但如果你这么说;先尝试this solution 以
immediate为特色,您可以至少通知警报是否触发。 -
我决定试试这个解决方案 - stackoverflow.com/a/37521683/732923。使用 refs 从父级本身调用 firestore 方法。它确实完成了这项工作,尽管使用 refs 似乎是一种值得怀疑的方式。