如何使用 Apollo 对 props change 进行查询?

How to useQuery on props change with Apollo?

目前我有一个 BooksList 组件,当单击标题时,我会将 props 传递给我的 BooksDetails 组件。如何使用 Apollo 钩子仅查询 props 更改?

我不确定如何使用挂钩来完成此操作。我查看了 Apollo 的 UseQuery 文档。我找不到有关 UseLazyQuery 的文档。

我尝试了以下方法,但总是 returns 未定义:

const { loading, error, data } = useQuery(getBookQuery, {
    options: (props) => {
      return {
        variables: {
          id: props.bookId
        }
      }
    }
  })

图书清单:

const BookList = () => {
  const {loading, error, data} = useQuery(getBooksQuery)
  const [selectedId, setId] = useState('');


  return (
    <div id='main'>
      <ul id='book-list'>
        {data && data.books.map(book => (
          <li onClick={() => setId(book.id)} key={book.id}>{book.name}</li>
        )) }
      </ul>
      <BookDetails bookId={selectedId} />
    </div>
  );
};

export default BookList;

图书详情:

const BookDetails = (props) => {

  const { loading, error, data } = useQuery(getBookQuery, {
    options: (props) => {
      return {
        variables: {
          id: props.bookId
        }
      }
    }
  })

  console.log(data)
  return (
    <div id='book-details'>
      <p>Output Book Details here</p>
    </div>
  );
};

export default BookDetails;

编辑 - 我忘了补充一点,我的 GetBookQuery 有一个 ID 参数,所以一个例子是 getBookQuery(123).

改为使用 useLazyQuery

  const [getBook, { loading, error, data }] = useLazyQuery(getBooksQuery);

完整示例:

import React from 'react';
import { useLazyQuery } from '@apollo/react-hooks';

const BookList = () => {
    const [getBook, { loading, error, data }] = useLazyQuery(getBooksQuery);

  return (
    <div id='main'>
      <ul id='book-list'>
        {data && data.books.map(book => (
          <li onClick={() => getBook({ variables: { id: book.id } })}} key={book.id}>{book.name}</li>
        )) }
      </ul>
      <BookDetails data={data} />
    </div>
  );
};

export default BookList;

可以在 Apollo 的 GraphQL 文档中找到示例和文档 https://www.apollographql.com/docs/react/data/queries/

我也在关注同样的例子,我带着同样的问题来到这里。我尝试按照以下方式进行。这可能对某人有帮助。

BookDetails.js:

function BookDetails({ bookId }) {
  const [loadDetails, { loading, error, data }] = useLazyQuery(getBook);

  useEffect(() => {
    if (bookId) {
      loadDetails({ variables: { id: bookId } });
    }
  }, [bookId, loadDetails]);

  if (!bookId) return null;
  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error!</p>;

  // for example purpose
  return <div>{JSON.stringify(data)}</div>;
}

export default BookDetails;