在 apollo-client 突变之后,你如何将反应组件的道具传递给选项?

How do you pass a react component's props down to options after apollo-client mutation?

如何在 apollo-client 突变后将 React 组件的 props 传递给选项?

我正在使用 reactapollo-client。在一个组件中,我试图 运行 一个删除突变,之后我想在不执行 refetchQueries 的情况下从本地商店中删除该项目。为此,我一直在使用 options.update 命令。

为了更新商店,我需要要删除的对象的父 ID。它在反应组件中可用,我只需要找到一种方法将它传递给 options.update 函数。

const { fundId } = this.props;
const variables = { documentId: document.id };
const options = { variables }

this.props.deleteFundDocument(options)
.then( response => console.log("Document successfully deleted", response) )
  .catch( e => console.log("Document not deleted", e) )

export default graphql(FundDocumentQL.deleteFundDocument, {name: 'deleteFundDocument', options: FundDocumentQLOptions.deleteFundDocument})
)(DocumentDisplay)

这是我从 FundDocumentQLOptions 传递给选项的内容,如您所见,我从 localStorage 获取了 fundId,这有点老套。我宁愿尝试正确地传递它。

const deleteFundDocument = {
  update: (proxy, {data: {deleteFundDocument}}) => {
    try {
      if (localStorage.getItem('documentViewerFundId')) {
        const fundId = localStorage.getItem('documentViewerFundId');
        let data = proxy.readQuery({query: FundDocumentQL.allFundDocuments, variables: {fundId: fundId}});
        console.log('data.allFundDocuments 1', data.allFundDocuments);
        // console.log('documentId', documentId);
        console.log('variables.documentId', variables.documentId);
        const newDocuments = data.allFundDocuments.filter( item => {
          return item.id !== deleteFundDocument.id;
        });
        console.log('newDocuments', newDocuments);
        data.allFundDocuments = [...newDocuments];
        console.log('data.allFundDocuments 2', data.allFundDocuments);
        proxy.writeQuery({query: FundDocumentQL.allFundDocuments, data, variables: {fundId: fundId}});
      }
    } catch (e) {
      console.log(e);
    }
  }
};

我在 apollo-client 文档中看到了这个例子: https://www.apollographql.com/docs/react/basics/mutations.html#graphql-mutation-options-variables

export default graphql(gql`
  mutation ($foo: String!, $bar: String!) {
    ...
  }
`, {
  options: (props) => ({
    variables: {
      foo: props.foo,
      bar: props.bar,
    },
  }),
})(MyComponent);

我看到了这个答案: Apollo can't access queryVariables in update: after a mutation

在此处阅读其他答案Apollo can't access queryVariables in update: after a mutation

当我在变更之前创建 options 对象时,我意识到我可以将 fundIdthis.props 传递到更新函数中。

const { fundId } = this.props;    
const variables = { documentId: document.id };
const options = { 
  variables: variables,
  update:  (proxy, { data: { deleteFundDocument } }) => FundDocumentQLOptions.deleteFundDocument(proxy, deleteFundDocument, fundId)}
this.props.deleteFundDocument(options)
.then( response => console.log('Document successfully deleted', response) )
.catch( e => console.log('Document not deleted', e) )


export default graphql(FundDocumentQL.deleteFundDocument, {name: 'deleteFundDocument'})(DocumentDisplay)

来自 FundDocumentQLOptions

const deleteFundDocument = (proxy, deleteFundDocument, fundId) => {
  try {
    let data = proxy.readQuery({query: FundDocumentQL.allFundDocuments, variables: {fundId: fundId}});
    // console.log('data.allFundDocuments 1', data.allFundDocuments);
    data.allFundDocuments = data.allFundDocuments.filter( item => {
      return item.id !== deleteFundDocument.id;
    });
    // console.log('data.allFundDocuments 2', data.allFundDocuments);
    proxy.writeQuery({query: FundDocumentQL.allFundDocuments, data, variables: {fundId: fundId}});
  } catch (e) {
    console.log(e);
  }
};