Apollo-Client GraphQL refetchQueries 如何工作?

Roe*_*oel 4 reactjs graphql apollo-client

知道我们如何从中获取响应数据吗refetchQueries?我从突变中获取了查询响应数据。

突变

import { gql } from 'apollo-boost';

export const DONE_TASK = gql`
    mutation DoneTask($taskId: ID!) {
        doneTask(input: {
            taskId: $taskId
        }) {
            task {
                id
                status
            }
        }
    }
`;
Run Code Online (Sandbox Code Playgroud)

询问

import { gql } from 'apollo-boost';

export const GET_TASKS_BY_STATUS = gql`
    query GetTasksByStatus($status: String!) {
        getTasksByStatus(status: $status) {
            edges {
                node {
                    id
                    status
                    description
                }
            }
        }
    }
`;
Run Code Online (Sandbox Code Playgroud)

用法

const response = await client.mutate({
    mutation: DONE_TASK,
    variables: {
        taskId: 1
    },
    refetchQueries: () => [{
        query: GET_TASKS_BY_STATUS,
        variables: { 
            status: "OPEN"
        },
    }]
});

console.log(response);
Run Code Online (Sandbox Code Playgroud) 输出
data: {
    doneTask: {
        task: { id:  1, status: 'DONE'}
    }
}
Run Code Online (Sandbox Code Playgroud)

但我期待来自 的响应数据GET_TASKS_BY_STATUS

Dan*_*den 8

您重新获取的任何查询都应该已被某些钩子、组件或HOCrefetchQueries使用。为了访问与突变相同的组件内的数据,您需要利用在同一组件内重新获取的查询:useQueryQuerygraphql

const { data } = useQuery(GET_TASKS_BY_STATUS, { variables: { status: 'OPEN' } })
const [mutate] = useMutation(DONE_TASK,{
  variables: {
    taskId: 1,
  },
  refetchQueries: () => [{
    query: GET_TASKS_BY_STATUS,
    variables: { 
      status: 'OPEN',
    },
  }],
})
Run Code Online (Sandbox Code Playgroud)