如何在 react-apollo-hooks 和 formik 中使用突变?

Posted

技术标签:

【中文标题】如何在 react-apollo-hooks 和 formik 中使用突变?【英文标题】:How to use mutations in react-apollo-hooks and formik? 【发布时间】:2019-11-28 06:49:36 【问题描述】:

在我的许多尝试中,我尝试过将 react-apollo-hooks 和 formik 一起使用,但这似乎是不可能的。表单中的数据仅在 <Formik> 标记中可用,否则无法在其之外访问。我也不能同时调用我的useMutation 钩子并将参数传递给它:

const SignUp = () => 
  const classes = useStyles();
  // The react-apollo-hook for useMutation
  // Its not hard to call this, but it seems impossible to call it,
  // with any sort of arguments.
  // It seems pointless not being able to pass in data from the form
  const [createUser,  loading ] = useMutation(CREATE_USER_MUTATION, 
    variables: 
      firstName: '???',
      lastName: '???',
      email: '???',
      password: '???',
    ,
  );
  // Formik stuff goes down here. It's impossible to call `useMutation` 
  // with the argument of `values`
  return (
    <Formik
      initialValues=
        firstName: '',
        lastName: '',
        email: '',
        password: '',
        showPassword: false,
      
      // This is the part that calls the hook.
      // I see no way of passing arguments to `useMutation` from here
      onSubmit=(values,  setSubmitting ) => createUser
      render=(submitForm, isSubmitting, values, setFieldValue) => (
        <div>
          <h1>Sign up for a new account</h1>
          <Form className=classes.container>
            <Field
              className=classes.textField
              name="firstName"
              type="text"
              label="First name"
              margin="dense"
              variant="outlined"
              component=TextField
            />
          </Form>
          <Button
            variant="contained"
            color="primary"
            margin="dense"
            className=classes.button
            disabled=isSubmitting
            onClick=submitForm
          >
            Sign Up
          </Button>
        </div>
      )
    />
  );

;

那么我怎样才能以某种方式将参数从onSubmit 传递到顶部的useMutation 部分?似乎不可能将参数传递给钩子。我不认为我可以在查询名称CREATE_USER_MUTATION 和具有设置的对象之外添加任何其他数据。

【问题讨论】:

【参考方案1】:

可以将突变变量提供给单个突变调用,而不是 useMutation 调用。因此,您可以在组件的顶部执行此操作:

const [createUser,  loading ] = useMutation(CREATE_USER_MUTATION)

然后在您实际调用createUser 时提供变量:

onSubmit=(values,  setSubmitting ) => createUser( variables: values )

【讨论】:

我之前找到了一个解决方法,它依赖于一些低效的东西,依赖于使用 React useState,在 onSubmit 函数中设置所有字段,并使用 useEffect 调用 createUser 毕竟只有字段已更新(因为它是异步的)。但它显然效率低下并且需要大量代码行。您的解决方案更加简洁明了!

以上是关于如何在 react-apollo-hooks 和 formik 中使用突变?的主要内容,如果未能解决你的问题,请参考以下文章

使用 `react-apollo-hooks` 和 `useSubscription` 钩子

将参数传递给 react-apollo-hooks useQuery

React-Apollo-Hooks 使用Mutation 传递空变量?

仅在第一次以惯用方式和优雅方式呈现组件时执行 react-apollo-hooks useQuery

react-apollo-hooks 中的 useMutation 没有传递变量

如何在 GraphQL 中正确链接 useQuery 和 useMutation?