可以尝试使用React hooks中的useMemo来缓存GraphQL操作,并根据变量的更改条件重新调用缓存的操作。从而实现在变量更改时也能重新查询数据。
代码示例如下:
import { useMemo } from 'react';
import { useQuery } from '@apollo/client';
import { graphql } from 'relay-runtime';
import { relayStylePagination } from '@apollo/client/utilities';
const QUERY = graphql`
query MyQuery($first: Int!, $after: String) {
items: myQuery(first: $first, after: $after) @connection(key: "myQuery_items") {
edges {
node {
id
name
}
}
pageInfo {
endCursor
hasNextPage
}
}
}
`;
function MyComponent(props) {
const { first, after } = props;
const queryVariables = useMemo(() => ({ first, after }), [first, after]);
const { loading, error, data, fetchMore } = useQuery(QUERY, {
variables: queryVariables,
fetchPolicy: 'cache-and-network',
notifyOnNetworkStatusChange: true,
});
const loadedData = data?.items?.edges?.map(edge => edge.node) ?? [];
const pageInfo = data?.items?.pageInfo;
const fetchMoreData = () => {
if (!pageInfo?.hasNextPage) return;
const { endCursor } = pageInfo;
fetchMore({
variables: { after: endCursor },
updateQuery: (prevResult, { fetchMoreResult }) => {
return relayStylePagination([...prevResult?.items?.edges, ...fetchMoreResult?.items?.edges], fetchMoreResult?.items?.pageInfo, prevResult);
}
});
};
// your component render code here...
}
在这个示例中,我们使用缓存的GraphQL操作,并在useMemo函数中将变量作为依赖条件。使用fetchMore来在查询结果后继续获取数据,并使用relayStylePagination更新查询结果。
通过这种方法,可以在变量更改时重新获取