等待 useLazyQuery 响应

Jul*_*cas 6 reactjs graphql apollo-client

我需要在按下提交按钮时调用查询,然后处理响应。

我需要这样的东西:

const [checkEmail] = useLazyQuery(CHECK_EMAIL)
const handleSubmit = async () => {
  const res = await checkEmail({ variables: { email: values.email }})
  console.log(res) // handle response
}
Run Code Online (Sandbox Code Playgroud)

尝试 #1:

const [checkEmail, { data }] = useLazyQuery(CHECK_EMAIL)
const handleSubmit = async () => {
  const res = await checkEmail({ variables: { email: values.email }})
  console.log(data) // undefined the first time
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Jul*_*cas 9

毕竟,这是我的解决方案。

export function useLazyQuery<TData = any, TVariables = OperationVariables>(query: DocumentNode) {
  const client = useApolloClient()
  return React.useCallback(
    (variables: TVariables) =>
      client.query<TData, TVariables>({
        query: query,
        variables: variables,
      }),
    [client]
  )
}
Run Code Online (Sandbox Code Playgroud)


kur*_*tko 8

这对我有用:

const { refetch } = useQuery(CHECK_EMAIL, {
  skip: !values.email
})

const handleSubmit = async () => {
  const res = await refetch({ variables: { email: values.email }})
  console.log(res)
}
Run Code Online (Sandbox Code Playgroud)

  • 在 @apollo/react-hooks@4.0.0 中, refetch 接受参数作为变量(不需要放入变量属性中。所以它是 `refetch({ email: value.email })` (2认同)

小智 6

您还可以像这样使用钩子onCompleted选项:useLazyQuery

const [checkEmail] = useLazyQuery(CHECK_EMAIL, {
  onCompleted: (data) => {
    console.log(data);
  }
});

const handleSubmit = () => {
  checkEmail({ variables: { email: values.email }});
}
Run Code Online (Sandbox Code Playgroud)