如何在 GraphQL 中正确链接 useQuery 和 useMutation?

IT技术 javascript reactjs graphql react-apollo react-hooks
2021-04-30 19:26:14

我有 useQuery 和 useMutation 从 react-apollo-hooks 背靠背。我希望能够使用 useQuery 的返回值作为 useMutation 的变量。目前, useQuery 的值没有及时返回变量,导致变量未定义。

const { data, error, loading } = useQuery(GET_POSTS, { 
    variables: {
        id: props.match.params.id
    }
})
const item = props.match.params.id
const owner = data.posts[0].author.id
const variables = { item , owner, startDate, endDate }
const bookItem = useMutation(CREATE_BOOKING_MUTATION, variables)

变量data.posts[0].author.id显示未定义。如何确保及时定义返回值?

2个回答

如何确保及时定义返回值?

您可以在useQuery阻止 后简单地检查条件


更新

不能有条件地调用钩子。

通常的建议是将条件放在useEffect

const { data, error, loading } = useQuery(GET_POSTS, { 
  variables: {
    id: props.match.params.id
  }
})
const item = props.match.params.id

// data.posts can be undefined at start
const owner = loading ? null : data.posts[0].author.id
const variables = { item , owner, startDate, endDate }
const bookItem = useMutation(CREATE_BOOKING_MUTATION, variables)
useEffect(() => {
  if(!loading) {
    bookItem(); // called when data ready
  }
})

另一种选择useApolloClient::

  • useQuery 加载突变所需的数据

  • const client = useApolloClient();

  • useEffect- 有条件地(!loading或非data空)使用client.mutate()获取的(查询中)数据作为变量;

自定义钩子可以通过 3 个参数完成: (query, mutation, { mapDataToVariables })

我认为您可以在实际调用突变时传递变量,例如:

...
const bookItem = useMutation(CREATE_BOOKING_MUTATION)
...
if(!loading && !error && data) {
  bookItem({
    variables: {
      owner: data.posts[0].author.id,
      ...
    }
  })
}