Firestore 데이터의 중첩된 v-for 루프는 변경 시 가장 깊은 계층을 반응적으로 복제합니다.
파이어스토어에 중첩된 데이터가 있는데, 이 데이터를 중첩된 목록으로 표시하려고 합니다.그러나 Firestore 데이터베이스에서 값을 변경해도 두 번째 수준의 값은 업데이트되지 않습니다.
로드 시 올바른 것으로 표시됩니다.
그러나 "온도1"을 "온도"로 변경하면 다음과 같이 업데이트됩니다.
페이지를 다시 로드하면 모든 것이 다시 올바르게 표시됩니다.
최상위 수준 이름(예: Cactus)을 변경하면 예상대로 동작합니다(이름이 반응적으로 업데이트됨).
두 번째 레벨 문자열도 중복 없이 단순히 반응적으로 업데이트되도록 하려면 어떻게 해야 합니까?
이것은 Firestore에 있는 내 데이터 구조입니다. (id는 자동 생성 ID입니다.)
-users (collection)
|-id0 (doc)
|-name: "Niels"
|-tiles (collection)
|-id1 (doc)
| |-name: "Monstera Deliciosa"
| |-services (collection)
| |-id2 (doc)
| | |-name: "Temperature"
| |-id3 (doc)
| |-name: "Relative-humidity"
|-id4 (doc)
|-name: "Cactus"
|-services (collection)
|-id2 (doc)
|-name: "Soil moisture"
다음은 내 코드의 발췌본입니다.
My Vue 구성 요소(기본 보기):대시보드.가치관
<template>
<div id="dashboard">
<ul v-for="tile in tiles" :key=tile.id>
<li>{{ tile.name }}</li>
<ul v-for="service in tile.services" :key=service.id>
<li>{{service.name}}</li>
</ul>
</ul>
</div>
</template>
<script>
import { mapState } from 'vuex'
const fb = require('../firebaseConfig.js')
export default {
computed: {
...mapState(['tiles'])
}
}
</script>
그리고 내 store.js 파일:
import Vue from 'vue'
import Vuex from 'vuex'
const fb = require('./firebaseConfig.js')
Vue.use(Vuex)
// handle page reload
fb.auth.onAuthStateChanged(user => {
if (user) {
// realtime updates from tiles
fb.usersCollection.doc(user.uid).collection('tiles').orderBy('name', 'asc').onSnapshot(tilesSnapshot => {
let tilesArray = []
tilesSnapshot.forEach(tileDoc => {
let tile = tileDoc.data()
tile.id = tileDoc.id
// console.log("Tile name:", tile.name)
let servicesArray = []
tileDoc.ref.collection('services').onSnapshot(servicesSnapshot => {
servicesSnapshot.forEach(serviceDoc => {
let service = serviceDoc.data()
service.id = serviceDoc.id
servicesArray.push(service)
})
})
tile.services = servicesArray
tilesArray.push(tile)
})
store.commit('setTiles', tilesArray)
})
}
})
export const store = new Vuex.Store({
state: {
tiles: []
},
mutations: {
setTiles(state, val) {
if (val) {
state.tiles = val
} else {
state.tiles = []
}
}
}
})
문제의 첫 번째 부분("Firestore 데이터베이스에서 값을 변경하면 두 번째 수준의 값이 업데이트되지 않습니다.")은 Firestore의 읽기가 얕다는 사실에서 비롯됩니다.
당신의 첫번째onSnapshot()
는 다음 쿼리의 결과를 수신합니다.
fb.usersCollection.doc(user.uid).collection('tiles').orderBy('name', 'asc')
또한 컬렉션에서 문서를 쿼리해도 하위 컬렉션에서 데이터를 가져오지 않습니다.결과적으로, 첫 번째는onSnapshot()
에서 문서를 변경할 때 트리거합니다.tiles
수집, 그러나 에서 문서를 변경할 때 트리거되지 않습니다.services
서브 컬렉션
언급URL : https://stackoverflow.com/questions/53897571/nested-v-for-loop-on-firestore-data-reactively-duplicates-deepest-layer-on-chang
'programing' 카테고리의 다른 글
api를 사용하여 워드프레스에 게시하는 방법은 무엇입니까? (0) | 2023.07.18 |
---|---|
include()에서 네임스페이스를 사용할 때 app_name에 대한 잘못 구성된 오류 (0) | 2023.07.18 |
SQL 화학: 만들기 vs.세션 재사용 (0) | 2023.07.18 |
준비된 파일의 Git 목록 (0) | 2023.07.18 |
인덱스 목록을 사용하여 행당 특정 열 인덱스를 선택하는 NumPy (0) | 2023.07.18 |