Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

ReactConfBR - Is Relay Modern the Future?

ReactConfBR - Is Relay Modern the Future?

React Conf BR talk about Relay Modern Declarative Data Fetching framework

Sibelius Seraphini

October 07, 2017
Tweet

More Decks by Sibelius Seraphini

Other Decks in Programming

Transcript

  1. - Duplicate fetch logic - Caching is hard - Data

    fetching is hard to optimize - Hard to handle different endpoints - Pagination can be tricky - Underfetching - Overfetching Data Fetching is tricky 4
  2. 5

  3. 6

  4. 7

  5. 8

  6. - Declarative (declare data your component needs) - Colocating (component

    + data requirement) - Performance - Common patterns (e.g., pagination) Value proposition 9
  7. - Static queries - Ahead of time code generation -

    Compat mode - Simpler and more predictable API - More light-weight (20% less) - Faster performance - Persisted Queries - Garbage Collection What's new in Relay Modern 11
  8. - GraphQL Subscriptions & Live Queries - Injectable Custom Field

    Handlers - Simpler Mutation API - Client Schema Extensions - Flowtype Generation - Extensible Core - Closer API to GraphQL Spec - no need for Viewer (Relay Classic) What's new in Relay Modern 12
  9. const UserRow = ({ user }) => ( <View> <Text>{user.name}</Text>

    <Text>{user.email}</Text> </View> ); const UserRowFragmentContainer = createFragmentContainer(UserRow, { user: graphql` fragment UserRow_user on User { name email } `, }); Data Components (aka containers) 14
  10. <QueryRenderer environment={environment} query={graphql` query UserQuery($id: ID!) { user(id: $id) {

    ...UserRow_user } } `} variables={{id: '110798995619330'}} render={({error, props}) => { if (error) { return <View>{error.message}</View>; } if (props) { return <UserFragmentContainer {...props} /> } return <View>Loading</View>; }} /> QueryRenderer (root of Relay tree) 15
  11. RefetchContainer export default createRefetchContainer(FeedStories, { feed: graphql` fragment FeedStories_feed on

    Feed @argumentDefinitions( count: {type: "Int", defaultValue: 10} ) { stories(first: $count) { edges { node { id ...Story_story } } } } ` }, graphql` query FeedStoriesRefetchQuery($count: Int) { feed { ...FeedStories_feed @arguments(count: $count) } } `, ); 16
  12. RefetchContainer - refetch _loadMore() { // Increments the number of

    stories being rendered by 10. const refetchVariables = fragmentVariables => ({ count: fragmentVariables.count + 10, }); this.props.relay.refetch(refetchVariables, null); } 17
  13. Mutations - A Write then Read const mutation = graphql`

    mutation AddShipMutation($input: AddShipData!) { addShip(input: $input) { faction { ships { id } } newShipEdge } } `; 18
  14. Mutations - Update Store const configs = [{ type: 'RANGE_ADD',

    parentID: 'shipId', connectionInfo: [{ key: 'AddShip_ships', rangeBehavior: 'append', }], edgeName: 'newShipEdge', }]; - RANGE_ADD - add node to edge - RANGE_DELETE - remove node from edge - NODE_DELETE - remove node from store - updater - imperative API 19
  15. Subscriptions const subscription = graphql` subscription MarkReadNotificationSubscription( $storyID: ID! )

    { markReadNotification(storyID: $storyID) { notification { seenState } } } `; 20
  16. I didn't mention 23 - GraphQL/Relay compiler - Babel plugin

    Relay - Live Queries - PaginationContainer - Mutation Updater Imperative API - Relay Directives - Relay Network Layer - Relay Environment - Cache