首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警告:从submitForm()错误捕获了一个未处理的错误:

警告:从submitForm()错误捕获了一个未处理的错误:
EN

Stack Overflow用户
提问于 2020-12-13 19:07:00
回答 1查看 2.4K关注 0票数 0

我正在使用react、nextjs和typescript启动一个项目,我试图向后端提交一个表单,但是当尝试使用该函数调用使用@ urql-codegen生成的函数时,我得到了以下警告: formik.esm.js:925警告:从submitForm()错误捕获了一个未处理的错误:无效钩子调用。钩子只能在函数组件的主体内调用。这种情况的发生有以下原因之一:

  1. 您可能有React的不匹配版本和呈现器(例如React )
  2. ,您可能正在违反Hooks
  3. 的规则,您可能在同一个应用程序

中有多个React副本。

和查询,但查询不会触发

我的错误可能是我不知道该怎么做

下面的代码

代码语言:javascript
运行
复制
   import React from 'react';
import { Formik, Form, Field, FormikHelpers } from 'formik';
import Wrapper from '../components/Wrapper';
import InputField from '../components/InputField';
import { toErrorMap } from '../utils/toErrorMap';
import { useRouter } from 'next/router';
import { createUrqlClient } from '../utils/createUrqlClient';
import { withUrqlClient } from "next-urql"
import { Button, LinearProgress, Grid } from '@material-ui/core';
import Paper from '@material-ui/core/Paper';
import { TextField } from 'formik-material-ui';
import { makeStyles } from '@material-ui/core/styles';
import Avatar from '@material-ui/core/Avatar';
import Typography from '@material-ui/core/Typography';
//import { useLoginUsuarioQuery } from '../generated/graphql';
import { useQuery } from 'urql';
import { useUserByIdQuery } from '../generated/graphql';

const Login: React.FC<{}> = ({ }) => {
  const router = useRouter();
  const classes = useStyles();
  
  const submitForm = ({username,password}) => {
    const [{data}] = useUserByIdQuery({variables:{id:1}});
    console.log(data);
  }    

  return (
    <Grid container component="main" className={classes.root}>
      <Grid item xs={false} sm={4} md={7} className={classes.image}></Grid>
      <Grid item xs={12} sm={8} md={5} component={Paper} elevation={6} square >
        <div className={classes.paper}>
          <Avatar className={classes.avatar}>
            M
                </Avatar>
          <Typography component="h1" variant="h5">
            Ingresar
                </Typography>
          <Formik
            initialValues={{ username: '', password: '' }}
            onSubmit={(values) => {submitForm(values)}}
          >
            {({ isSubmitting }) => (
              <Form className={classes.form}>
                <Field
                  component={TextField}
                  name="username"
                  type="text"
                  label="username"
                  variant="outlined"
                  className={classes.form}
                />
                <br />
                <Field
                  component={TextField}
                  type="password"
                  label="Password"
                  name="password"
                  variant="outlined"
                  className={classes.form}
                />
                {isSubmitting && <LinearProgress />}
                <br />
                <Button
                  variant="contained"
                  color="primary"
                  disabled={isSubmitting}
                  type="submit"
                  className={classes.form}

                >
                  Submit
                </Button>
              </Form>
            )}
          </Formik>
        </div>
      </Grid>
    </Grid>


  );

}


export default withUrqlClient(createUrqlClient)(Login)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-12 12:36:47

看起来,您正在调用useUserByIdQuery is submitForm,这是一个回调。根据命名约定,前者是一个钩子,只能由组件直接调用,按照React的“钩子规则”https://reactjs.org/docs/hooks-rules.html

我看到您使用的是(可能) GraphQL代码生成器生成的查询,它为您提供了一个挂钩,用于获取“用户按ID”。我假设在用户提交此登录表单时,您需要进行此调用。要实现这一点,取决于您想要做什么,您要么必须进行必要的查询,要么添加某种状态。

如果您处理的是登录,则前者更有可能,正如我所设想的那样,未来您可能希望进行登录突变。在这种情况下,可以使用client.query(...).toPromise()使用urql客户端,但必须手动传递查询,或者可以使用useUserByIdQuery和传递pause: true作为参数,并使用返回的executeQuery函数为其提供ID。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65279535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档