【发布时间】:2020-06-30 03:47:57
【问题描述】:
我正在尝试通过 redux-thunk 操作查询我的 Firebase 后端,但是,当我在使用 useEffect() 的初始渲染中这样做时,我最终会遇到以下错误:
Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.
我的操作只是返回一个 Firebase 查询快照,然后我在 reducer 中收到了该快照。我使用钩子来调度我的操作:
export const useAnswersState = () => {
return {
answers: useSelector(state => selectAnswers(state)),
isAnswersLoading: useSelector(state => selectAnswersLoading(state))
}
}
export const useAnswersDispatch = () => {
const dispatch = useDispatch()
return {
// getAnswersData is a redux-thunk action that returns a firebase snapshot
setAnswers: questionID => dispatch(getAnswersData(questionID))
}
}
以及以下选择器从我的快照和 redux 状态中获取我需要的数据:
export const selectAnswers = state => {
const { snapshot } = state.root.answers
if (snapshot === null) return []
let answers = []
snapshot.docs.map(doc => {
answers.push(doc.data())
})
return answers
}
export const selectAnswersLoading = state => {
return state.root.answers.queryLoading || state.root.answers.snapshot === null
}
在我的实际组件中,我首先尝试通过调度我的操作来查询我的后端,然后在加载数据后尝试读取结果数据,如下所示:
const params = useParams() // params.id is just an ID string
const { setAnswers, isAnswersLoading } = useAnswersDispatch()
const { answers } = useAnswersState()
useEffect(() => {
setAnswers(params.id)
}, [])
if (!isAnswersLoading)) console.log(answers)
为了澄清,我正在使用我的useAnswersDispatch 来调度一个返回 Firebase 数据快照的 redux-thunk 操作。然后我使用我的useAnswersState 钩子在数据加载后访问数据。我正在尝试在我的实际视图组件的useEffect 中分派我的查询,然后使用我的状态挂钩显示数据。
但是,当我尝试打印 answers 的值时,我从上面收到错误消息。我将非常感谢任何帮助,如果有帮助,我很乐意提供更多信息,但是,我已经测试了我的减速器和动作本身,它们都按预期工作,所以我相信问题出在文件中如上所述。
【问题讨论】:
-
嘿,除非您依赖
setAnswers, isAnswersLoading, answers触发更改其中之一的操作,否则我看不出您是如何进入无限循环的。你能创建一个小代码框或其他东西来展示你的问题吗 -
但是,您可以尝试在 return
export const useAnswersState = () => { const answers = useSelector(state => selectAnswers(state)); const isAnswersLoading = useSelector(state => selectAnswersLoading(state)); return { answers, isAnswersLoading } }之外执行挂钩 -
应该有更多代码导致无限循环,如果您正在寻找答案,您可以制作一个最小的代码框。
标签: javascript reactjs firebase redux react-redux