Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Data-fetching in React applications with Relay ...
Search
Marc-Andre Giroux
August 10, 2016
Programming
700
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Data-fetching in React applications with Relay & GraphQL
Marc-Andre Giroux
August 10, 2016
More Decks by Marc-Andre Giroux
See All by Marc-Andre Giroux
It Depends - Examining GraphQL Myths & Assumptions
xuorig
0
140
So you Want to Distribute your GraphQL Schema?
xuorig
4
880
So you Want to Distribute your GraphQL Schema?
xuorig
0
690
GraphQL Schema Design @ Scale
xuorig
5
2.2k
Continuous Evolution of GraphQL Schemas @ GitHub
xuorig
3
2.2k
GraphQL à Shopify
xuorig
0
290
Exploring GraphQL
xuorig
0
310
GraphQL @ Shopify
xuorig
6
1.8k
GraphQL on Rails
xuorig
2
400
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
130
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
120
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
140
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
500
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
280
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
GitHubCopilotCLIのスラッシュコマンドを自作してみる
htkym
0
100
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
840
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
620
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
180
Featured
See All Featured
Believing is Seeing
oripsolob
1
170
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
What does AI have to do with Human Rights?
axbom
PRO
1
2.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
RailsConf 2023
tenderlove
30
1.5k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
WENDY [Excerpt]
tessaabrams
11
38k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Ethics towards AI in product and experience design
skipperchong
2
330
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Transcript
Data-fetching in React applications with Relay & GraphQL 1
A beautiful component 2
A beautiful simple component 3
React { <Shop> <Product> <ProductImage> 4
{ Shop component 5
Product component { 6
ProductImage component { 7
What if we needed to add a description? { 8
What kind of data is needed ? Shop Product Image
9
Let’s fetch that using reusable endpoints ? /shop/1 /products/1 /products/2
image/sabc images/def 10
Let’s fetch that using ad-hoc endpoints ? /shop_cart_page /shop_cart_page?include=images /shop_cart_page_with_images?num_images=2
/shop_cart_page_single_prices_and_descriptions_version1.2 /shop_cart_page_with_prices_and_descriptions_but_no_images 11 op_cart_page_with_prices_and_descriptions_and_images_but_only_one_300
12
GraphQL 13
query { myShop { name } } Simple query 14
Response { “myShop” { “name”: “My Kool Shop” } }
15
Query { myShop { name location { city address }
products(orderby: PRICE) { name price } } } 16
Response { “myShop” { “name”: “My Kool Shop”, “location”: {
“city”: “Montreal”, “address”: “5333 Avenue Casgrain”, }, “products”: [{ “name”: “A Chair”, “price”: 10000 }, { “name”: “A Table”, “price”: 20000 }] } } 17
Type System { myShop { name location { city address
} products(orderby: PRICE) { name price } } } type QueryRoot { myShop: Shop } 18
Type System enum ProductOrderEnum { PRICE, POPULARITY, ALPHABETICAL } type
Shop { name: String location: Address products(orderby: OrderEnum): [Product] } { { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 19
Type System type Address { city: String address: String }
{ { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 20
Type System type Product { name: String price: Int }
{ { myShop { name location { city address } products(orderby: POPULARITY) { name price } } } 21
Fragments { { myShop { name …locationFragment } } fragment
locationFragment on Shop { location { city address } } 22
Mutations { mutation { createProduct(name: “Kanye West Shoes”) { name
} } 23
How Relay can help { Relay React GraphQL 24
Query colocation { query Fragment Fragment Fragment Fragment 25
Query colocation { Shop Product Product Image 26
Relay Containers / Higher Order Components { Relay.createContainer(ShopComponent, { fragments:
{ … } }); Container Shop 27
Shop Component (Relay) { 28
Shop component (Relay) { 29
Product component (Relay) { 30
ProductImage component (Relay) { 31
How the *&^#@$ does that even work? { 32
Step 1: Making sense out of fragments { fragments: {
image: () => Relay.QL` fragment on Image { url } `, }, 33
Relay.QL (pre-transform) { fragments: { image: () => Relay.QL` fragment
on Image { url } `, }, 34
Relay.QL (transformed) { fragments: { image: function image() { return
function () { return { children: [{ fieldName: 'url', kind: 'Field', metadata: {}, type: 'String' }, { fieldName: 'id', kind: 'Field', metadata: { isGenerated: true, isRequisite: true }, type: 'ID' }], id: _reactRelay2.default.QL.__id(), kind: 'Fragment', metadata: {}, name: 'ProductImage_ImageRelayQL', type: 'Image' }; }(); } 35
Step 2: Query diff ( The Store ) { RelayRecord
Store • Client Side Cache • Normalized / Flattened Store 36
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { name image { url } } `, }, 37
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { name description image { url } } `, }, 38
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { description } `, }, 39
Step 2: Query diff { fragments: { product: () =>
Relay.QL` fragment on Product { description } `, }, 40
Step 3: Split Deferred queries { fragments: { product: ()
=> Relay.QL` fragment on Product { name description ${Images.getFragment('product').defer()}} } `, }, 41
Step 3: Split Deferred queries { 42
Step 3: Split Deferred queries { 43
Step 4: Subtract in-flight queries { 44
Step 4: Subtract in-flight queries { 45
{ myShop { name location { city address } products(orderby:
PRICE) { name price } } } Final step: Printing { 46
Back to the Store { 47 Relay Record Store Cached
Records Queued Records
Mutations { class AddProductMutation extends Relay.Mutation { getMutation() { return
Relay.QL`mutation { addProduct }`; } getVariables() { return { productName: this.props.product.name }; } getFatQuery() { … } getConfigs() { … } getOptimisticResponse() { … } } 48
And so much more { 49 Subscriptions @stream Garbage collection
Server side rendering Connections
For more info: { 50 https://facebook.github.io/relay https://github.com/facebook/graphql
Thank you! Try it out yourself :) @__xuorig__ http://mgiroux.me xuorig
51