进行后续突变后中继不更新

Posted

技术标签:

【中文标题】进行后续突变后中继不更新【英文标题】:Relay not updating after doing subsequent mutations 【发布时间】:2018-04-14 15:53:54 【问题描述】:

目前,我们偶然发现了在现代接力中进行突变的问题。我们有一本包含许多条目的日记。每当用户添加不存在哪一天日记的条目时,我们也会在创建条目之前创建一个日记。一切都按预期工作,但 UI 不会在突变后立即更新。这是代码。

AddDiaryMutation

import  commitMutation, graphql  from 'react-relay';

const mutation = graphql`
mutation AddDiaryMutation($input: AddDiaryInput!) 
  createDiary(input: $input) 
     diary 
        id
        ...EntryList_entries
     
  

`;

let clientMutationId = 0;

const commit = (environment,  date , callback) =>
commitMutation(environment, 
    mutation,
    variables: 
      input: 
        date,
        clientMutationId: clientMutationId++
      
    ,
    onCompleted: response => 
    const id = response.createDiary.diary.id;
    callback(id);
  
);

export default  commit ;

AddEntryMutation 将从 AddDiaryMutation 响应中获取 id 以添加条目。

import  commitMutation, graphql  from 'react-relay';
import  ConnectionHandler  from 'relay-runtime';

const mutation = graphql`
mutation AddEntryMutation($input: AddEntryInput!) 
   createEntry(input: $input) 
     entryEdge 
       node 
         id
         project 
           name
         
         speaker 
            name
         
         
      
     
    
   `;

function sharedUpdater(store, diaryId, newEdge) 
    const diaryProxy = store.get(diaryId);
    const conn = ConnectionHandler.getConnection(diaryProxy, 
       'EntryList_entries');
    ConnectionHandler.insertEdgeAfter(conn, newEdge);
 

let clientMutationId = 0;

  const commit = (environment,  diaryId, ...rest , callback) =>
     commitMutation(environment, 
       mutation,
       variables: 
         input: 
            ...rest,
            clientMutationId: clientMutationId++
         
       ,
       updater: store => 
          const payload = store.getRootField('createEntry');
          const newEdge = payload.getLinkedRecord('entryEdge');
          sharedUpdater(store, diaryId, newEdge);
       ,
       onCompleted: () => callback()
);

export default  commit ;

EntryList 片段

fragment EntryList_entries on Diary 
  entries(first: 20) @connection(key: "EntryList_entries", filters: []) 

    edges 
      node 
        ...Entry_entry
      
    
  

条目片段

fragment Entry_entry on Entry 
  id
  project 
    name
  
  speaker 
    name
  

【问题讨论】:

【参考方案1】:

我也遇到了这个更新程序的问题。我建议在每个变量上使用 console.log 并查看链条制动的位置。我的 getConnection 方法有问题(我正在更改我的架构以包括边)。您还可以通过控制台从您的环境中记录商店以检查那里的记录。

【讨论】:

以上是关于进行后续突变后中继不更新的主要内容,如果未能解决你的问题,请参考以下文章

使用后续突变和缺失片段中继 commitUpdate 回调

中继项目中的更新突变问题

中继现代突变,RANGE_ADD / Append

中继突变:突变分页关联

使用中继环境的突变

中继突变不能动态工作