Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Last active November 7, 2017 05:20
Show Gist options
  • Select an option

  • Save simenbrekken/953233453690ccb9bf809fdb91eca534 to your computer and use it in GitHub Desktop.

Select an option

Save simenbrekken/953233453690ccb9bf809fdb91eca534 to your computer and use it in GitHub Desktop.
react-apollo graphql de-enhancer

Usage

import gql from 'graphql-tag'

const MyComponent = () => (
  <div>
    <h1>Render props!</h1>

    <GraphQL
      query={gql`
        query ProductsQuery {
          products {
            id
            name
          }
        }
      `}
      render={props => {
        const { products } = props.data

        if (products) {
          return products.map(product => <div>{product.name} ({product.id})</div>)
        }

        if (loading) {
          return <div>Loading!</div>
        }

        return null
      }}
    />
  </div>
)
import { Component, createElement } from 'react'
import { graphql as withGraphQL } from 'react-apollo'
const createRenderer = ({ query, render }) =>
withGraphQL(query)(mergedPropsAndData => render(mergedPropsAndData))
class GraphQL extends Component {
renderer = createRenderer(this.props)
componentWillReceiveProps(nextProps) {
// TODO: Handle props.render as well
if (nextProps.query !== this.props.query) {
this.setState({ renderer: createRenderer(nextProps) })
}
}
render() {
return createElement(this.renderer, this.props)
}
}
export default GraphQL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment