Firebase Vuexfire将Firestore集合绑定到对象而不是列表
我的Firestore数据库中有以下集合: 我可以使用以下内容将其绑定到vuex存储:Firebase Vuexfire将Firestore集合绑定到对象而不是列表,firebase,vue.js,google-cloud-firestore,vuefire,vuexfire,Firebase,Vue.js,Google Cloud Firestore,Vuefire,Vuexfire,我的Firestore数据库中有以下集合: 我可以使用以下内容将其绑定到vuex存储: 状态:{ 资产:[], }, 行动:{ bindAssets:firestoreAction({bindFirestoreRef})=>{ 返回bindFirestoreRef('assets',db.collection('assets')) }), }, 但是,这会将它们作为列表绑定到资产,即 [ {id:“id1”/*etc.*/}, {id:“id2”/*etc.*/}, {id:“id3”/*e
状态:{
资产:[],
},
行动:{
bindAssets:firestoreAction({bindFirestoreRef})=>{
返回bindFirestoreRef('assets',db.collection('assets'))
}),
},
但是,这会将它们作为列表绑定到资产
,即
[
{id:“id1”/*etc.*/},
{id:“id2”/*etc.*/},
{id:“id3”/*etc.*/},
]
如果是,我希望它被绑定为:
{
“id1”:{/*etc.*/},
“id2”:{/*etc.*/},
“id3”:{/*etc.*/},
}
如何实现这一点?如果要转换对象中的
资产
数组(通过绑定资产
集合获得),如下所示
{
"id1": { /* etc. */ },
"id2": { /* etc. */ },
"id3": { /* etc. */ },
}
以下Vuex getter应该可以实现这一点:
state: {
assets: [],
},
actions: {
bindAssets: firestoreAction(({ bindFirestoreRef }) => {
return bindFirestoreRef('assets', db.collection('assets'))
}),
},
getters: {
assetsObj: state => {
const arrayToObject = (array) =>
array.reduce((obj, item) => {
obj[item.id] = item
return obj
}, {})
return arrayToObject(state.assets)
}
}
更新以下评论(在聊天室中): 如果只想绑定到一个文档,则应使用
bindAssetDoc
和assetDoc
执行以下操作
商店
state: {
assets: [],
assetDoc: null
},
mutations: vuexfireMutations,
actions: {
bindAssetDoc: firestoreAction(({ bindFirestoreRef }, payload) => {
return bindFirestoreRef('assetDoc', db.collection('assets').doc(payload.id))
}),
bindAssets: firestoreAction(({ bindFirestoreRef }) => {
return bindFirestoreRef('assets', db.collection('assets'))
})
}
通过/asset/:assetId打开的组件
<script>
//...
export default {
created() {
console.log('OK1');
this.$store
.dispatch('bindAssetDoc', { id: this.$route.params.assetId });
}
};
</script>
//...
导出默认值{
创建(){
console.log('OK1');
这是一家$1的商店
.dispatch('bindAssetDoc',{id:this.$route.params.assetId});
}
};
这很奇怪。我试图重现您的案例,结果是资产
数组是一个与data()
方法对应的对象数组,即没有任何.key
属性。您使用的是特定的设置吗?@RenaudTarnec这是一个只读属性,如本文所述:我只是将其添加到示例中,以表明它确实存储了密钥,只是没有以我想要的形式存储。我试图了解如何获得此[{.key:“id1”/*etc.*/},…
数组。你能分享一下用来获取它的代码吗?@RenaudTarnec我刚刚手写了那部分。但是你只需要记录一个getter,返回state.assets
@RenaudTarnec,就可以得到它。事实上,我确实输入了一个错误。默认情况下,它是“id”而不是“.key”(我已经更新了我的问题)