apollo-client - 使用 useLazyQuery 钩子进行异步验证
问题描述
如何使用Apollo Client 的useLazyQury钩子处理 react-hook-form 中的字段级异步验证?
据我了解,钩子是在某些操作(如)useLazyQuery
上初始化 GraphQL 请求的唯一方法。onClick
不幸的是,这个钩子返回void
并迫使我使用data
变量来获取价值。但。true/false
react-hook-form 需要在 asyncValidation中返回一个值。如何处理这种情况?
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
}
}
})}
/>
)
}
解决方案
我认为你必须在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
.
推荐阅读
- mysql - 创建触发器以防止插入其他表的条件
- android - 用于数字和电子邮件 ID 的 Android 语音转文本
- mongodb - 使用 $first 删除重复文档
- javascript - jquery $get 上的“jQuery 需要一个带有文档的窗口”
- scala - 从 Spark2 中的 spark 临时表创建表后记录丢失
- r - 重新排序字符类数据框列并绘图
- powershell - PowerShell ISE 登录-AzureRmAccount JavaScript 错误
- python - 在同一个 Qwidget 中显示不同的 Paint 类
- c++ - 在哪里可以找到所有可用的 __attribute__ 选项
- c++ - Visual Studio 下的 std::nan/std::nanf 有什么问题?