【发布时间】:2020-12-02 06:48:38
【问题描述】:
上下文:我有一个自定义挂钩来获取 Firestore 文档。它监视文档更改,然后返回它和加载状态。我在另一个组件中使用了这个钩子。
问题:更改挂钩返回的状态值(loading 和document)不会触发组件使用挂钩重新呈现并查看更新的值。
我的发现:其他自定义钩子可以工作并触发渲染,所以useDocument 钩子肯定有问题。如果另一个钩子触发了重新渲染,那么loading 才会最终更新。 loading 和 document 的值确实在钩子中按预期更新,但组件的重新渲染仍然不会触发。
重要说明: useFirebase() 是在 useDocument 内调用的钩子,其状态使用 constate 库提升到上下文中。所以从技术上讲,这个钩子是一些提供者的消费者,它位于跟踪 firebase 库的树的上层。这是为了避免不必要的网络调用。
export function useDocument() {
const { auth, firestore } = useFirebase() // asynchronously fetches firebase modules
const [loading, setLoading] = useState(true)
const [document, setDocument] = useState()
let unsubscribe = null
useEffect(() => {
let unsubscribe = null
const watchDocument = () =>
params?.query.onSnapshot(
(doc) => {
setDocument(doc.data() as T | undefined)
setLoading(false)
},
(err) => {
console.log(err)
setError(err.message)
}
)
if (firestore && auth?.currentUser) {
unsubscribe = watchDocument()
}
return () => {
unsubscribe && unsubscribe()
}
}, [firestore, auth?.currentUser])
return {
document,
loading
}
}
const MyComponent = () => {
const {document, loading} = useDocument()
console.log(loading) // changes to "loading" doesn't trigger rerender of this component
}
【问题讨论】:
标签: javascript reactjs firebase react-hooks react-context