【问题标题】:Recieved this error: Error: Too many re-renders. React limits the number of renders to prevent an infinite loop收到此错误:错误:重新渲染过多。 React 限制渲染次数以防止无限循环
【发布时间】:2023-03-31 13:50:01
【问题描述】:

我有一个步进表单,它使用 GraphQL/Apollo 和 React 在两个不同的地方插入数据。

代码如下:

    export function ProjectStep({classes, nextStep}) {

      const {loading, error, data} = useUserQuery();
      const organizationsArray = _.get(data, "user.organizations");
      const [projectName, setProjectName] = useState("");
      const [organization, setOrganization] = useState("");
      const [createProject, appMutationResponse] = useappInsertMutation();
      const [createToken, tokenMutationResponse] = usetokenInsertMutation();
      const submitForm = () => {
        const variables = {name: projectName, orgId: organization, description: ""};
        createProject({variables});
      };

      const submitToken = () => {
        const variables = {
          enable: true,
          lastUsed: Date.now().toString(),
          appId: appMutationResponse.data.appInsert.id,
          orgId: appMutationResponse.data.appInsert.orgId,
        };
        createToken({variables});
      };

      if (appMutationResponse.data) {
        submitToken();
      }
}

第一个插入打开:

const submitForm = () => {
            const variables = {name: projectName, orgId: organization, description: ""};
            createProject({variables});
          };

第二个插入打开:

const submitToken = () => {
            const variables = {
              enable: true,
              lastUsed: Date.now().toString(),
              appId: appMutationResponse.data.appInsert.id,
              orgId: appMutationResponse.data.appInsert.orgId,
            };
            createToken({variables});
          };

这些事件在一个按钮中被调用:

 <Button variant="contained" color="primary" type='button' onClick={submitForm}>
    Next
 </Button>

但是,当我点击按钮时,我得到了这个错误:

Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.

访问我的数据库时,我看到在一次调用中使用这部分代码保存了 50 个令牌:

const submitToken = () => {
                const variables = {
                  enable: true,
                  lastUsed: Date.now().toString(),
                  appId: appMutationResponse.data.appInsert.id,
                  orgId: appMutationResponse.data.appInsert.orgId,
                };
                createToken({variables});
              };

我认为因为我使用了一个钩子,我得到了一个响应,这个响应给我带来了这个错误,问题是,为什么我在一个调用中保存和接收 50 个令牌?

【问题讨论】:

    标签: graphql react-hooks hook react-apollo react-apollo-hooks


    【解决方案1】:

    您已经在渲染中直接编写了以下代码,因此当 appMutationResponse.data 可用时,如果调用触发重新渲染的 submitToken 函数,然后再次调用该函数导致无限循环。

    if (appMutationResponse.data) {
       submitToken();
    }
    
    

    解决办法是把这段代码放到useEffect中,在数据变化时运行

    useEffect(() => {
       if (appMutationResponse.data) {
          submitToken();
       }
    }, [appMutationResponse.data])
    

    【讨论】:

    • 感谢您的回复,它解决了我的问题。这很有启发性。
    猜你喜欢
    • 2020-05-23
    • 2021-09-05
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2021-05-17
    • 2021-02-04
    • 2021-07-01
    相关资源
    最近更新 更多