#javascript #firebase #vue.js #google-cloud-firestore #vuex
#javascript #firebase #vue.js #google-облако-firestore #vuex
Вопрос:
Вместо обновления текущего объекта в vuex-bindings создается новый. База данных представляет собой облачный firestore от Google.
Я использую Vue, vuex, vuetify, google-cloud-firestore и google-storage в своем приложении.
Это мой модуль хранилища для этой конкретной части:
import { catsColl, productsColl } from '../firebase'
const state = {
catOrProducts: [],
}
const mutations = {
setCatProd(state, val) {
state.catOrProducts = val
},
}
const actions = {
// https://vuefire.vuejs.org/api/vuexfire.html#firestoreaction
// eslint-disable-next-line no-unused-vars
async bindCatsWithProducts({ commit, dispatch }, CatID) {
const contain = CatID || 'nC'
const arr = []
catsColl.where('parentCat', '==', contain).orderBy('name', 'asc')
.onSnapshot(snap => {
snap.forEach(cat => {
arr.push({ id: cat.id, ...cat.data() })
})
})
productsColl.where('isSold', '==', true).where('cats', 'array-contains', contain).orderBy('name', 'asc')
.onSnapshot(snap => {
snap.forEach(prod => {
arr.push({ id: prod.id, ...prod.data() })
})
})
commit('setCatProd', arr)
},
}
export default {
namespaced: true,
state,
actions,
mutations,
}
Представление обрабатывается в моем компоненте внутри контейнера. Два компонента предназначены для продуктов и категорий, поскольку я хочу показать их по-разному.
<v-container fluid>
<v-row
align="center"
justify="center"
>
<v-col
v-for="catOrProduct in catOrProducts"
:key="catOrProduct.id"
@click.prevent="leftClickProd($event, catOrProduct)"
@contextmenu.prevent="rightClickProd($event, catOrProduct)"
>
<TileCat
v-if="typeof(catOrProduct.parentCat) == 'string'"
:src="catOrProduct.pictureURL"
:name="catOrProduct.name"
/>
<TileProduct
v-if="catOrProduct.isSold"
:name="catOrProduct.name"
:src="catOrProduct.pictureURL"
:store-inv="catOrProduct.storeInv"
:warning-store-inv="catOrProduct.warningStoreInv"
:min-store-inv="catOrProduct.minStoreInv"
:bar-inv="catOrProduct.barInv"
:warning-bar-inv="catOrProduct.warningBarInv"
:min-bar-inv="catOrProduct.minBarInv"
:is-used-directly="catOrProduct.isUsedDirectly"
:is-active="catOrProduct.isActive"
:sell-price="catOrProduct.sellPrice"
/>
</v-col>
</v-row>
</v-container>
РЕДАКТИРОВАТЬ 26.09.20
Два используемых там компонента (плитки) выглядят следующим образом (хотя продукт более сложный, с некоторым динамическим распределением классов)
<template>
<v-hover
v-slot:default="{ hover }"
class="unselectable"
>
<v-card :elevation="hover ? 6 : 2">
<v-img
class="white--text align-end"
:src="src"
gradient="to bottom, rgba(0,0,0,0), rgba(0,0,0,.5)"
aspect-ratio="1"
height="17rem"
contain
>
<v-card-title class="white--text ">
{{ name }}
</v-card-title>
</v-img>
</v-card>
</v-hover>
</template>
<script>
export default {
props: {
name: {
type: String,
default: ''
},
src: {
type: String,
default: '@/assets/placeholder.png'
},
}
}
</script>
РЕДАКТИРОВАТЬ КОНЕЦ
Когда я обновляю свой продукт (новая цена), он автоматически перезагружается, но обновления не происходит. Вместо этого он порождает второй объект.
Кроме [Vue warn]: Duplicate keys detected: 'TtUJJ0Agvd3DRBynmYgk'. This may cause an update error.
того, появляется ошибка.
У меня "v-for" key
правильно установлен идентификатор моего продукта / категории. Дубликатов нет. Я попытался запустить с
v-for="(catOrProduct, index) in catOrProducts"
:key="index"
Но это только устраняет duplicated keys detected
ошибку.
Все еще создаются объекты.
Я также удалил категории из уравнения, но даже без них я все равно получаю дубликаты.
Если я вношу больше изменений, он каждый раз создает новый объект! Перезагрузка всей страницы возвращается к отображению только правильного продукта, ошибка которого отсутствует в базе данных.
Как мне сделать так, чтобы привязка такого рода выполнялась правильно?
Комментарии:
1. Чтобы собрать некоторую информацию, используют ли компоненты один и тот же объект данных?
2. @MrTech я отредактировал свой вопрос и добавил код плитки. Они просто берут некоторые реквизиты. Они даже не знают своего идентификатора. Нужно ли мне давать им один?
3. Я нашел эту ссылку и думаю, что это может быть связано с тем, что происходит github.com/vuejs/vue/issues/7805
4. По сути, это похоже на ошибку с Vue.
5. «Компоненты дублируются, когда они совместно используют один и тот же объект данных #7805»