标签: react-apollo-hooks

如何使用 useLazyQuery() 在每次点击时执行查询

使用我的useLazyQuery()钩子@apollo/react-hooks可以在单击按钮时执行查询。但是我不能使用它在连续点击时执行相同的查询。

export default ({ queryVariables }) => {
  const [sendQuery, { data, loading }] = useLazyQuery(GET_DIRECTION, {
    variables: queryVariables
  });

  return <div onClick={sendQuery}>Click here</div>;
}
Run Code Online (Sandbox Code Playgroud)

在上面sendQuery只执行一次。

reactjs react-apollo apollo-client react-apollo-hooks

14
推荐指数
1
解决办法
4299
查看次数

无效的挂钩调用。当我在 useEffect 中调用 useQuery 时,只能在函数组件主体内部调用 Hooks

我在我的 React 项目中使用 apollo-graphql ,并且收到以下错误

无效的挂钩调用。钩子只能在函数组件体内调用

这是我的代码

import React, { useEffect, useState, useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";

// **************** COMPONENTS ****************
import { GET_MORTGAGE_JOURNEY } from "../../../../Graphql/Journeys/query";

export default function index() {
  const insuranceId = useSelector((state) => state.mortgage.insuranceId);

  // Panels Heading to show on all panels

  useEffect(() => {
    if (insuranceId) {
      getMortgageData(insuranceId);
    }
  }, [insuranceId]);

  function getMortgageData(insuranceId) {
    const { loading, error, data } = useQuery(GET_MORTGAGE_JOURNEY, {
      variables: { id: insuranceId },
    }); …
Run Code Online (Sandbox Code Playgroud)

apollo reactjs react-apollo react-hooks react-apollo-hooks

8
推荐指数
1
解决办法
7759
查看次数

Apollo Hooks - useLazyQuery 如果传递查询,则不使用 onCompleted 选项

我有一个用于 apollo 延迟查询的自定义去抖动钩子:

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
    }]
}
Run Code Online (Sandbox Code Playgroud)

除了onCompleted选项之外,这有效。当实现这样的钩子时:

const [doQuery] = useDebouncedQuery(query);
doQuery({
    onCompleted: data => {
        console.log(data);
    }
})
Run Code Online (Sandbox Code Playgroud)

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

export function useAsyncSelectQuery(schema, options) {
    const [doQuery, {...rest}] = _useLazyQuery(schema, options);
    ...
Run Code Online (Sandbox Code Playgroud)

..并像这样实现它,它的工作原理:

const [doQuery] = useDebouncedQuery(query, {
    onCompleted: data => {
        console.log(data);
    }
});
Run Code Online (Sandbox Code Playgroud)

为什么是这样?难道我做错了什么?我有单独的逻辑需要处理传递到onCompleted不同位置的数据,因此在查询初始化时我无法传递该选项。任何帮助是极大的赞赏。

apollo-client react-apollo-hooks

7
推荐指数
1
解决办法
6964
查看次数

如何在 Apollo 中打开和关闭轮询?

useQuery像这样使用钩子:


function Foo() {
  const { data, error, loading } = useQuery(MY_QUERY, { pollInterval: 1000 });

  return (
    <>
      <Bar/>
      <Baz/>
      {data}
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

现在,无论是BarBaz使用相同的查询。Baz是一个侧边栏,我想在它处于活动状态时禁用轮询。

我有一个用于处理状态的全局减速器Baz,我像这样修改了它:

if (isSidebarOpen === false) {
  ...
  apolloClient.stop();
} else {
  // TODO
}
Run Code Online (Sandbox Code Playgroud)

这会停止轮询,但我不知道如何在侧边栏关闭时重新激活它(即在else上面的块中)。

我这样做正确吗?是否有不同的方法可以使用 Apollo 切换 GraphQL 查询的轮询?

apollo graphql react-apollo apollo-client react-apollo-hooks

7
推荐指数
2
解决办法
4157
查看次数

Apollo 中的 client.query 和 useQuery 有什么区别?

在我的查询中,我混合使用了远程和本地属性。本地属性具有不同的值,具体取决于:

  1. 远程属性
  2. 当前的unix时间戳

本地解析器根据这些规则计算本地状态。现在,我面临一个场景,我需要放弃useQuery并使用 Apollo Clientquery来增强灵活性。

除了结构上的差异(例如,useQuery接受两个参数,而client.query只接受一个参数 - 选项对象),使用一个比另一个更安全吗?

我确定了文档中未描述的至少一个差异。当我client.query多次调用时,本地解析器在开始时只运行一次。使用useQuery,数据总是被重新计算并且它有不同的值(如上面的#2)。

apollo react-apollo apollo-client react-apollo-hooks

7
推荐指数
0
解决办法
1085
查看次数

如何有条件地调用 useQuery 钩子?

由于Hooks规则,不应有条件地调用 hooks。那么如何使用 有条件地获取数据useQuery呢?例如,假设我想在功能组件中获取数据,但前提是someState === someValue? 即我想避免useQuery()在任何条件之前调用,因为在这些时间获取数据没有意义。

reactjs react-apollo react-apollo-hooks

7
推荐指数
2
解决办法
4442
查看次数

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

我正在使用最优秀的react-apollo-hooks 库,特别是 useQuery 钩子:

function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: false, id: '0' });
    ...   
    const { data, error } = useQuery(GET_JOBS, { suspend: true });
    if (error) {
        return <div>Error! {error.message}</div>;
    }
    const jobs = data.cxJobs; //This is our data
    ....
    function editCallback(e, more) {
        setDialogOpen({ show: true, id: e });
    }
....
}

Run Code Online (Sandbox Code Playgroud)

当然,一旦我更改了 dialogOpen 状态,组件就会重新渲染并再次执行 graphql 查询。根据对库github repo的建议,我重写了代码以设置一些状态以及 useEffect:

function Index() {
    ...
    const [dialogOpen, setDialogOpen] = useState({ show: …
Run Code Online (Sandbox Code Playgroud)

reactjs react-apollo react-apollo-hooks

6
推荐指数
1
解决办法
1233
查看次数

如何测试使用useQuery的组件的示例?

我有一个使用Apollo钩子库的useQuery钩子的React组件。我在测试此组件时遇到问题。这是我当前的设置。

import React from 'react';
import { BrowserRouter as Router } from 'react-router-dom';
import DashboardBar from './DashboardBar';
import { render, cleanup } from '@testing-library/react';
import { QUERY } from '../../queries';
import { ApolloClient } from 'apollo-client';
import { ApolloProvider as ApolloHooksProvider } from '@apollo/react-hooks';
import { MockedProvider } from 'react-apollo/test-utils';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { MockLink } from 'apollo-link-mock';
import wait from 'waait';
import casual from 'casual';

describe('<DashboardBar />', () => {
  it('renders and matches …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-apollo react-hooks react-apollo-hooks

6
推荐指数
1
解决办法
1163
查看次数

使用 useMutation 可能出现未处理的承诺拒绝警告

当我useMutation与 react native 一起使用时,出现未处理的承诺拒绝错误。这是产生问题的代码:

const [createUser, { error, loading }] = useMutation(CREATE_USER_MUTATION);
Run Code Online (Sandbox Code Playgroud)

每当我的 graphql 服务器向客户端返回错误时,我都会收到未处理的承诺拒绝错误(下面的屏幕截图)。我可以通过添加这样的错误处理程序来让它消失,但这似乎是一个黑客。有什么想法吗?我做错了什么还是阿波罗人应该解决这个问题?

const [createUser, { error, loading }] = useMutation(CREATE_USER_MUTATION, {
  onError: () => {}
});
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

react-apollo react-apollo-hooks

6
推荐指数
1
解决办法
1649
查看次数

onCompleted 是否与 useMutation 一起使用?

我在反应项目中使用 useMutation 钩子。突变成功运行,但之后没有达到 onCompleted 。

我已经在突变中将 notifyOnNetworkStatusChange 设置为 true ,但这似乎没有帮助。

const [createUser] = useMutation(SIGNUP_MUTATION);

createUser({
  variables: {
     firstname,
     lastname,
     email
  },
  notifyOnNetworkStatusChange: true,
  onCompleted: (data) => {
     // not called
     confirm(data);
  }
});
Run Code Online (Sandbox Code Playgroud)

react-apollo-hooks

6
推荐指数
1
解决办法
4807
查看次数