使用 useLazyQuery 钩子进行异步验证

时间:2021-07-01 20:57:04

标签: apollo-client react-hook-form

如何使用 Apollo Client 的 useLazyQury hook 处理 react-hook-form 中的字段级异步验证?

据我所知,useLazyQuery 钩子是针对某些操作(例如 onClick)初始化 GraphQL 请求的唯一方法。不幸的是,这个钩子返回 void 并迫使我使用 data 变量来获取值。但。 react-hook-form 需要在 asyncValidation 中返回一个 true/false 值。遇到这种情况怎么办?

const AsyncValidation = () => {
  const [nicknameUniqueness, data ] = useLazyQuery(NICKNAME_UNIQUENESS_QUERY)
   
  return (
    <input
      {...register('nickname', {
        validate: {
          asyncValidate: (value) => {
            nicknameUniqueness({ variables: { nickname: value } }) // returns void by Apollo documentation

            // How to get up-to-dated data here?

            return data?.nicknameUniqueness.isUnique
          }
        }
      })}
    />
  )
}

1 个答案:

答案 0 :(得分:1)

我认为您必须在这里使用 useQuery 而不是 useLazyQuery。您只需在 skip 对象中将 true 设置为 options,然后您可以使用 refetch 延迟加载/验证您的昵称,因为 refetch 将返回ApolloQueryResult。一件重要的事情是在此处为您的 async 函数使用 asyncValidate 函数,以便您可以等待该查询调用的结果。

const AsyncValidation = () => {
  const { refetch: nicknameUniqueness } = useQuery(NICKNAME_UNIQUENESS_QUERY, {
    skip: true
  });

  return (
    <input
      {...register("nickname", {
        validate: {
          asyncValidate: async (value) => {
            const { data } = await nicknameUniqueness({
              variables: { nickname: value }
            });

            return data?.nicknameUniqueness.isUnique;
          }
        }
      })}
    />
  );
};

我做了一个使用 useQuery 异步加载数据的小例子。

Edit Apollo Client useLazyQuery Example (forked)