当我加载我的Nextjs页面时,我收到以下错误消息:* "错误:渲染的钩子比上次渲染时多。"*
如果我在useEffect
代码之后添加if (!router.isReady) return null
,页面在初始加载时就不能访问solutionId
,从而导致useDocument
钩子出错,该钩子需要solutionId
从数据库中获取文档。
因此,this thread不能解决我的问题。
任何人,请帮助我解决这个问题!
我的代码:
const SolutionEditForm = () => {
const [formData, setFormData] = useState(INITIAL_STATE)
const router = useRouter()
const { solutionId } = router.query
if (!router.isReady) return null
const { document } = useDocument("solutions", solutionId)
const { updateDocument, response } = useFirestore("solutions")
useEffect(() => {
if (document) {
setFormData(document)
}
}, [document])
return (
<div>
// JSX code
</div>
)
}
useDocument挂钩:
export const useDocument = (c, id) => {
const [document, setDocument] = useState(null)
const [isLoading, setIsLoading] = useState(true)
const [error, setError] = useState(null)
useEffect(() => {
const ref = doc(db, c, id)
const unsubscribe = onSnapshot(
ref,
(snapshot) => {
setIsLoading(false)
if (snapshot.data()) {
setDocument({ ...snapshot.data(), id: snapshot.id })
setError(null)
} else {
setError("No such document exists")
}
},
(err) => {
console.log(err.message)
setIsLoading(false)
setError("failed to get document")
}
)
return () => unsubscribe()
}, [c, id])
return { document, isLoading, error }
}
4条答案
按热度按时间jtw3ybtb1#
你不能在一个条件之后调用钩子
useEffect
,你的定制useDocument
,或者任何其他的。在你的例子中的条件是这个早期返回的if (!router.isReady) returns null
。不要在循环、条件或嵌套函数内调用Hooks。相反,始终在React函数的顶层使用Hooks,在任何早期返回之前...
只需将该
if (!router.isReady) returns null
从SolutionEditForm
中删除,并按如下所示更改useDocument
。djp7away2#
if (!router.isReady) return null
语句导致函数提前结束,并且不执行后续钩子。你需要重新构造钩子,使它们都不是条件钩子:
然后使
useDocument
避免发送额外的呼叫:并使用复选框更新了效果:
zujrkrfu3#
1.无法有条件地调用UseEffect
1.仅在客户端调用UseEffect。
如果您使用最小表示法,可以尝试修复此错误
ztigrdn84#
路由器就绪是好的,但您需要等待查询参数。请尝试以下操作: