reactjs - 使用 useEffect 避免在多个 firebase 快照上重新渲染
问题描述
问题:我有一个 useEffect,我从 4 个不同的 firebase 集合中收集数据。这使得站点(重新)渲染 4 次。问题是我该如何避免这种情况?我知道它会为每个 setState 重新渲染,但不确定如何避免这种情况。我假设我将不得不使用某种异步功能?
我对异步函数很陌生,我想可能在每个 onSnap 函数上使用 promise -> resolve,但这不会破坏监听器分离吗?
代码如下:
useEffect(() => {
const unsubInstruments = DB.collection(`organizations/${window.localStorage.getItem(OrgKey)}/assets/instrumentarchive/items`)
const unsubUniforms = DB.collection(`organizations/${window.localStorage.getItem(OrgKey)}/assets/uniformarchive/items`)
const unsubOtherAssets = DB.collection(`organizations/${window.localStorage.getItem(OrgKey)}/assets/other_assets/items`)
const unsubAssetsCollection = DB.collection(`organizations/${window.localStorage.getItem(OrgKey)}/assets`)
const getCollectionSizes = async () => {
const assetsSize = () => {
unsubAssetsCollection.onSnapshot((snap) => {
let assetsSize = snap.size
setAssetsSize(assetsSize)
})
return () => unsubInstruments()
}
const instrumentsSize = () => {
unsubInstruments.onSnapshot((snap) => {
let instruments = snap.size
setInstruments(instruments)
})
return () => unsubInstruments()
}
const uniformsSize = () => {
unsubUniforms.onSnapshot((snap) => {
let uniforms = snap.size
setUniforms(uniforms)
})
return () => unsubUniforms()
}
const otherAssetsSize = () => {
unsubOtherAssets.onSnapshot((snap) => {
let otherAssets = snap.size
setOtherAssets(otherAssets)
})
return () => unsubOtherAssets()
}
assetsSize()
instrumentsSize()
uniformsSize()
otherAssetsSize()
}
getCollectionSizes()
}, [])
解决方案
所以正如评论所说,答案是不要像我一样使用状态,而是有一个状态,其中状态变量。
推荐阅读
- javascript - 如何在角度中使用 lodash 按年份过滤 rowData
- azure - 从 Azure blob 引用 SVG 文件
- performance - 在迭代器中“回收”项目以获得更好的性能
- ruby-on-rails - 是否/为什么 Rails 6 仍在使用/推荐 CoffeeScript?
- javascript - 当我点击页面上的某个块时,我需要更改我的网址
- ruby - 用于更新 url 和包标识符的 Fastlane 命令
- php - 有没有办法对数组进行子串化?
- javascript - How to remove touch offset on webpage?
- java - Android PlaceAutocompleteFragment 自动关闭
- sql-server - 在使用 INSERT 触发器后向 INSERTED 表添加值