javascript - 反应钩子:超过最大深度
问题描述
我是 React 中的一个功能组件,当我使用 useState 钩子在返回值中设置一个值时,我收到有关超出最大更新深度的错误。
这是代码:
const TaskDetail = (props) => {
const [selectedOperatorForTime, setSelectedOperatorForTime] = useState({})
return (
<div >
<Query query={GET_API_VAL}>
{({ loading, error, data }) => {
let operatorList = {key1: data.value1, key2: data.value2}
setSelectedOperatorForTime(operatorList);
{//rest of the code}
我收到以下错误
Unhandled Rejection (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.
我尝试将 setState 放在一个单独的函数中,而不是直接将它放在返回中,但我仍然看到相同的错误。有什么指导吗?我正在使用 Apollo 客户端(这是 Query 组件的用途。不确定我是如何导致它被重复调用的。
我尝试用字符串替换 operatorList,它工作正常。所以这似乎是一个对象的问题。有人经历过吗?
解决方案
如果您无论如何都在使用反应钩子,那么您不妨使用此处记录的 apollo-react 钩子。
不要Query
在 JSX 中使用组件,而是在组件useQuery
的顶部使用,如下所示:
const { loading, error, data } = useQuery(GET_API_VAL);
这也可能消除对单独的需要,useState
因为它始终包含当前数据。
您的具体示例,没有其他更改,将如下所示:
const TaskDetail = (props) => {
const [selectedOperatorForTime, setSelectedOperatorForTime] = useState({});
const { loading, error, data } = useQuery(GET_API_VAL);
useEffect(() => {
// Set selectedOperatorForTime whenever the data changes
let operatorList = {key1: data.value1, key2: data.value2};
setSelectedOperatorForTime(operatorList);
}, [data]);
return (
<div >
{//rest of the code}
推荐阅读
- matlab - 在 Matlab 中求解积分符号
- angular - 选择日期选择器材质后如何格式化数据?
- python - 比较每个项目中具有多个值的两个列表
- pdf - Libreoffice Writer(无头和非无头)在将 pdf 导出为 PDF/A 后删除其签名
- java - 使用 postDelayed 延迟打开片段是一个好习惯吗?
- amazon-web-services - 我在我的 dynamodb 流中没有看到任何记录
- c# - 如何从作者 datagridview 单元格更改 datagridview 标题文本
- java - 微服务或 Web 应用程序如何响应 http 请求
- c - PDFlib=> 如何将打印纸的分辨率设置为 300dpi
- javascript - 在多个 firestore 集合中使用 orderby