0

我有点困惑如何在 graphql 中执行多重突变。

我已经阅读了有关使用graphql()函数或compose()函数的文章,但我不明白这些是传统的方法(版本 2)还是仍然是一种有效的方法。

我目前正在使用带有 grandstack 的 apollo 3.3,在我的组件中我执行以下操作来执行突变(我使用useMutation()了由提供的钩子ApolloClient

const CreateFBUser = gql `
  mutation CreateFBUser($name: String, $fbId: String!) {
    CreateFBUser(name: $name, fbId: $fbId) {
        _id
        id
        fbId
        name
    }
  }
`

function FbUserForm() {

    const { id } = useParams()
    const [formState, setFormState] = useState({})
    
    const [createFBUser,{data: createData}] = useMutation(CreateFBUser)

    const { loading, error, data } = useQuery(FBUser,{
        variables: {_id: id}
    }); 
    ...
    ..
    .
    

如您所见,我没有使用诸如<Query>, 之类的组件..

第一个问题:这个组件与 apollo 旧版本有关吗?仍然经常使用还是useMutation()钩子是阿波罗 3 的首选?

第二个问题:我需要执行与第一个突变相关的第二个突变,并且我需要从第一个突变生成的 id 来执行第二个突变

//the first mutation
const CreateFBUser = gql `
  mutation CreateFBUser($name: String, $fbId: String!) {
    CreateFBUser(name: $name, fbId: $fbId) {
        _id
        id
        fbId
        name
    }
  }
`

//the second mutation (pseudocode)
const AddFBUserMemberOf = gql`  
    mutation AddFBUserMemberOf($from: _GroupInput!, $to: _FBUserInput!) {
        AddFBUserMemberOf(from: $from, to: $to) {
            from
            to
        }
    }
`

此外,应根据值/变量/其他内容有条件地执行第二次突变

4

1 回答 1

0

渲染道具组件已被弃用,并且不会根据文档收到进一步的更新或错误修复

对于你的第二个问题;从返回的突变函数采用选项参数useMutation中的一个onCompleted属性,该属性在突变成功完成后执行。

const [createFBUser,{data: createData}] = useMutation(CreateFBUser)
const [addFBUserMemberOf] = useMutation(AddFBUserMemberOf)

createFBUser({
  variables: {
    //...
  },
  onCompleted: (data) => {
    // data contains the result of createFBUser
    addFBUserMemberOf({
      variables: {
        //...
      }
    })
  }
})
于 2021-02-08T16:09:39.683 回答