2016-05-16 54 views
2

在RelayJS中重新排序連接的最佳方式是什麼?爲重新排序的連接創建樂觀響應

在我的用戶界面中,我允許我的用戶「交換」兩個項目,但在這個項目周圍創建變化有點棘手。

我現在正在做的是天真的方式,即使用FIELDS_CHANGE來改變我的節點本身。

它的工作原理,但問題是我似乎無法爲它寫一個樂觀的更新。我能夠將一個ID列表傳遞給我的graphql服務器,但這對於樂觀更新不起作用,因爲它期望實際的數據。

所以我想我必須嘲笑我的'連接'界面,但不幸的是,它仍然無法正常工作。我'複製'我的重新排序節點getOptimisticResponse,但它似乎被忽略。數據與實際的服務器響應相匹配。 (IDS簡體)

原:

{ 
    item: { 
    edges: { 
     {cursor: 1, node: {id:2}} 
     {cursor: 2, node: {id:1}} 
    } 
    } 
} 

(什麼都不做): 樂觀的回覆:

{ 
    item: { 
    edges: { 
     node: {id:1} 
     node: {id:2} 
    } 
    } 
} 

服務器的回覆:

{ 
    item: { 
    edges: { 
     {cursor: 1, node: {id:1}} 
     {cursor: 2, node: {id:2}} 
    } 
    } 
} 

是怎麼回事?它是等價的(除了遊標),即使我添加了遊標,它仍然不起作用。

我在做什麼錯?還有一種更簡單的方法來模擬我的ID到連接?

另外,有沒有辦法讓這些數據零碎?現在,重新排序兩個項目重新請求整個列表,因爲我的突變配置。我想我可以用RANGE_ADDRANGE_DELETE來做'模擬交換',但是有沒有更簡單的方法來做到這一點?

回答

1

由於您在響應用戶重新排序項目時觸發了突變,因此我假設您存儲了服務器端項目的位置或順序。對於你正在做的事情,創建樂觀響應的一種方法可以是使用該信息的positionorder信息。在服務器端,項目需要提供附加字段position。在客戶端,顯示的項目按position排序。

當用戶交換兩個項目時,在客戶端突變的樂觀響應中,您只需交換這兩個項目的position字段。這同樣適用於服務器端的變異。

樂觀響應代碼可以是這樣的:

getOptimisticResponse() { 
    return { 
    item1: { 
     id: this.props.item1.id, 
     position: this.props.item2.position, 
    }, 
    item2: { 
     id: this.props.item2.id, 
     position: this.props.item1.position, 
    }, 
    }; 
}