Slide 3
Slide 3 text
id,
text,
}
`,
viewer: () => Relay.QL`
fragment on User {
${ChangeTodoStatusMutation.getFragment('viewer')},
${RemoveTodoMutation.getFragment('viewer')},
}
`,
},
- mutation 的範例
- 新增一筆 todo
_handleTextInputSave = (text) => {
Relay.Store.update(
new AddTodoMutation({text, viewer: this.props.viewer})
);
}
- mutation 的六個關鍵步驟
fragments: 宣告 mutation 操作過程中一定要取得的欄位
getOptimisticResponse: 為了實現 optimistic update 而提供的假資料
getFatQuery: mutation 後要從 server 取回的新資料
getMutation: 指定要操作的 mutation 名稱(要事先定義在 schema.js 內)
getConfigs: mutation 後從 server 取回新資料該如何更新本地端舊資料,注意這裡有四種 type:
FIELDS_CHANGE, NODE_DELETE, RANGE_ADD, RANGE_DELETE
getVariables: 取得 mutation 要用的變數,例如新輸入的 text 內容
- routing
- 目前看來將與 react-router 配合
# 結論
- 採用 GraphQL/Relay 的考量
→ 省掉的部份
- 原本 client 要手工維護的各種 CRUD 與 optimistic update code 皆可省略
→ 不能省的部份
- client 還是要寫 RemoveTodoMutation.js 來定義更新 logic
- getFatQuery(), getConfigs(), getOptimisticResonpose()等
← 雖然最後一定是 copy/paste 直接用
← 並且將來可省掉這步
- server 上要多一份 schema.js ,頗長
- 而且 CRUD 操作要用它定義的 graph connection 語法,要重學
- 目前 GraphQL/Relay 的規格與範例都還在快速演化中,至少等兩個月再進場不遲
- 現階段摸熟 redux 與週邊配套方案效益最高
- 參考
- Falcor
- netflix.github.io/falcor/starter/what-is-falcor.html
- Netflix 推出,以 JSON graph 為主的解決方案