首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apollo钩子-如果在查询上传递,则useLazyQuery不使用onCompleted选项

Apollo钩子-如果在查询上传递,则useLazyQuery不使用onCompleted选项
EN

Stack Overflow用户
提问于 2019-08-10 00:55:59
回答 3查看 8.1K关注 0票数 8

我为apollo惰性查询提供了一个自定义的去反跳钩子:

代码语言:javascript
复制
import {useLazyQuery} from '@apollo/react-hooks';
import debounce from "lodash/debounce";

export function useDebouncedQuery(schema) {
    const [doQuery, {...rest}] = useLazyQuery(schema);

    const query = React.useCallback(debounce(doQuery, 1000), []);

    return [query, {
        ...rest
    }]
}

这是可行的,但onCompleted选项除外。当像这样实现钩子时:

代码语言:javascript
复制
const [doQuery] = useDebouncedQuery(query);
doQuery({
    onCompleted: data => {
        console.log(data);
    }
})

...the onCompleted选项不会触发。但是,如果我将钩子改为:

代码语言:javascript
复制
export function useAsyncSelectQuery(schema, options) {
    const [doQuery, {...rest}] = _useLazyQuery(schema, options);
    ...

。。并像这样实现它,它是有效的:

代码语言:javascript
复制
const [doQuery] = useDebouncedQuery(query, {
    onCompleted: data => {
        console.log(data);
    }
});

为什么会这样呢?我做错了什么吗?我有单独的逻辑,需要在不同的位置处理传递给onCompleted的数据,所以当查询初始化时,我不能传递该选项。任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

发布于 2019-09-06 00:41:22

因此,由useLazyQuery挂钩返回的函数在options参数上没有onCompleted属性,因此您不能使用它。

根据docs:https://www.apollographql.com/docs/react/api/react-hooks/#result-1,该函数返回一个参数,参数如下:

代码语言:javascript
复制
export interface QueryLazyOptions<TVariables> {
    variables?: TVariables;
    context?: Context;
}

我认为,对于您正在尝试实现的任务,一个很好的解决方案是使用useEffect钩子,监视useDebouncedQuery钩子返回的属性数据中的更改,然后按您希望的方式处理数据。

代码如下:

代码语言:javascript
复制
const [doQuery, { data, loading, error }] = useDebouncedQuery(
  QUERY
);

useEffect(() => {
  if (data && data.property && !loading) {
    // handle data here
  }
}, [data, loading]);

function handleQuery() {
  doQuery();
}

希望这对你有所帮助!

票数 4
EN

Stack Overflow用户

发布于 2021-10-11 11:38:50

您不能在调用useLazyQuery时设置onCompleted,但可以在定义 useLazyQuery时设置。

所以这是行不通的:

代码语言:javascript
复制
const [doQuery] = useDebouncedQuery(query);
doQuery({
    onCompleted: data => {
        console.log(data);
    }
})

但是这个工作:

代码语言:javascript
复制
const [doQuery] = useDebouncedQuery(query, {
    onCompleted: data => {
        console.log(data);
    }
});
doQuery()
票数 1
EN

Stack Overflow用户

发布于 2020-08-24 19:45:50

在初始化useLazyQuery时传递onCompleted函数

代码语言:javascript
复制
const [doQuery] = useDebouncedQuery(query, {
    onCompleted: data => {
        console.log(data);
    }
});

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

https://stackoverflow.com/questions/57434350

复制
相关文章

相似问题

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