SlideShare a Scribd company logo
1 of 27
Download to read offline
🤔
redux-observable
v.s
react-apollo
解決的問題
😍
• graphql(gql`yourquery`, options)(Component)
• ⼤大幅簡化 data fetch 的邏輯
• 可以在 graphql HOC 定義各種奇技淫巧的操作
• ⾃自動 Observable
遇到的問題
💩
• component 必須要知道 data 的形狀狀,跟 query 的 schema ⾼高度耦合,
實際上有點 container 的感覺

• 並不是每個 query 都是在 componentDidMount 就要送出去。

• 仍然會遇到 data 需要在不同層級取⽤用的問題。

• error handling。{props.error && <ErrorBlock
error={props.error} />}
react-apollo 2
🤔
• 可以取⽤用 <Query />, <Mutation /> component 代替 HOC

• render props 有更更多彈性
折衷⽅方案
😉
• 單純 query ⾴頁⾯面⽤用 react-apollo HOC

• 比較複雜的⾴頁⾯面搭配 redux-observable epic 操作

• 加入 apollo-link-http 作 request 的預處理理
containers/trivia-billing/SigningList/epics.js
containers/trivia-billing/PaymentList/index.js
containers/trivia-billing/AlertMessage/index.js
原本以為這樣應該可⾏行行
😄
• 透過 epic 來來管理理複雜的非同步操作

• 透過 middleware 統⼀一處理理 error, logger, notification 等
實際⽤用起來來好像也不錯
😊
但...天不從⼈人願
🙁
開始遇到⼀一些難解的問題...
🤢
• ☹簡單的 query 都必須 serialize 為 action,真的很⿇麻煩

• ☹如果是 mutate 操作,少了了 ObservableQuery 的幫助,必須送 action
⾃自⼰己 diff 更更新。

• ☹graphql 與 redux-observable 交錯,不知道怎麼整合比較優雅

• 要⾃自⼰己控管 loading state
Pagination
🤔
WTF?
🤔
Optimistic UI
🤔
updateComment = ({ id, content }) =>
mutate({
variables: { id, content },
optimisticResponse: {
__typename: “Mutation”,
updateComment: {
id,
content,
__typename: “comment”
}
}
})
Subscription, poll 等等
🤔
思考 1
🌝
• redux 與 apollo 適合共存嗎?

• 怎樣的情況下要採⽤用哪個解決⽅方案比較好

• apollo 社群逐漸壯⼤大,功能也⽇日漸豐富

• redux 舒適圈

• 各種花式⽅方案 apollo-link-http apollo-link-state apollo-inmemory-cache

• apollo-final-solution
各種情境思考
😶
• 讀操作頻繁,寫入操作少(報表等純 read ⽤用的 data)

• 讀操作少,寫入頻繁(批次操作)

• 讀寫皆頻繁(出帳系統、BD 系統等)
Observable Query
👀
• 優點:可以優雅解決批次操作的問題,省下不少功

• 缺點:擺脫了了 redux 的控制
Demo
-
• client.watchQuery(query)
• client.mutate
• graphql(query)
client.mutate({
mutation: gql`
mutation mutatePerson {
mutatePerson(input: { name: "eason", age: 150 }) {
id
name
age
}
}
`,
}).then(console.log)
obs$ = client.watchQuery({
query: gql`
query getPeople {
people {
id
name
age
}
}
`
})
如果⽤用 redux…
🤔
思考⼀一下
🤔
• 為什什麼 react-apollo 使⽤用 HOC?

• 使⽤用 redux 的限制?
結論
⚖
• 銀彈是不存在的

• 如果開發時間允許,再多想幾分鐘

• redux 與 apollo 有各⾃自適合的場景

• 不要後悔悔
天⾺馬⾏行行空
🤔
• 😜透過 redux middleware 機制來來監聽 query

• 👹強化 epic,加入類似 .ofGraphql 之類的機制

• 🙂利利⽤用 react16 的 Provider, Consumer 機制,將 graphql HOC 包裝後
的 component 當作 provider 使⽤用

More Related Content

What's hot

Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)Will Huang
 
Frontend Devops at Cloudinsight
Frontend Devops at CloudinsightFrontend Devops at Cloudinsight
Frontend Devops at CloudinsightYan Wang
 
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case Study
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case StudyOozie in Practice - Big Data Workflow Scheduler - Oozie Case Study
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case StudyFX Live Group
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会Joseph Chiang
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 
React + mobx分享(黄英杰)
React + mobx分享(黄英杰)React + mobx分享(黄英杰)
React + mobx分享(黄英杰)kkxx1254
 

What's hot (12)

Asp.net core v1.0
Asp.net core v1.0Asp.net core v1.0
Asp.net core v1.0
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
 
Frontend Devops at Cloudinsight
Frontend Devops at CloudinsightFrontend Devops at Cloudinsight
Frontend Devops at Cloudinsight
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case Study
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case StudyOozie in Practice - Big Data Workflow Scheduler - Oozie Case Study
Oozie in Practice - Big Data Workflow Scheduler - Oozie Case Study
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 
不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会不断归零的前端人生 - 2016 中国软件开发者大会
不断归零的前端人生 - 2016 中国软件开发者大会
 
宅學習 Firebase
宅學習 Firebase宅學習 Firebase
宅學習 Firebase
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 
React + mobx分享(黄英杰)
React + mobx分享(黄英杰)React + mobx分享(黄英杰)
React + mobx分享(黄英杰)
 

Similar to redux-observable with react-apollo

Redux+react js
Redux+react jsRedux+react js
Redux+react js國昭 張
 
W3CTech美团react专场-Thinking in React
W3CTech美团react专场-Thinking in ReactW3CTech美团react专场-Thinking in React
W3CTech美团react专场-Thinking in React美团点评技术团队
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4Daniel Chou
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践Jackson Tian
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
JSX is NOT HTML
JSX is NOT HTMLJSX is NOT HTML
JSX is NOT HTML柏軒 鄒
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版Kirk Chen
 
Hello reactJS 0~1 Bulid my first web app
Hello reactJS 0~1 Bulid my first web appHello reactJS 0~1 Bulid my first web app
Hello reactJS 0~1 Bulid my first web apphungjie19
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7Justin Lin
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plusDongxu Yao
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用Jerry Lin
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeAngel Boy
 

Similar to redux-observable with react-apollo (20)

Redux+react js
Redux+react jsRedux+react js
Redux+react js
 
Gwt rpc
Gwt rpcGwt rpc
Gwt rpc
 
W3CTech美团react专场-Thinking in React
W3CTech美团react专场-Thinking in ReactW3CTech美团react专场-Thinking in React
W3CTech美团react专场-Thinking in React
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
How to ASP.NET MVC4
How to ASP.NET MVC4How to ASP.NET MVC4
How to ASP.NET MVC4
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
JSX is NOT HTML
JSX is NOT HTMLJSX is NOT HTML
JSX is NOT HTML
 
關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版關於 Javascript 非同步的那些事兒 公開版
關於 Javascript 非同步的那些事兒 公開版
 
Hello reactJS 0~1 Bulid my first web app
Hello reactJS 0~1 Bulid my first web appHello reactJS 0~1 Bulid my first web app
Hello reactJS 0~1 Bulid my first web app
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
Javascript primer plus
Javascript primer plusJavascript primer plus
Javascript primer plus
 
介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用介紹前端 Web 技術在跨平台開發上的應用
介紹前端 Web 技術在跨平台開發上的應用
 
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
 

redux-observable with react-apollo