Pass variable from input to GraphQL search call Pass variable from input to GraphQL search call reactjs reactjs

Pass variable from input to GraphQL search call


You'll want to split this up into at least two components. One that holds the state of what the user searched, then another that actually does the querying by getting a prop. Additionally you can have the apollo higher order component skip the query if the form was submitted without entering something.

import React, {Component} from 'react'import {graphql} from 'react-apollo'import gql from 'graphql-tag'class Results extends Component {   render() {    // apollo provides results under the data prop    const {data} = this.props;    return <h1>{data.search.namej}</h1>   }}const ResultsWithQuery = graphql(gql`query FindTeam($query: String!) {    search(query: $query, type: TEAM) {        name    }}`, {skip: (ownProps) => !ownProps.query})(Results);export class Search extends Component {constructor(props) {    super(props)    this.state = {        search: ''    }}updateSearch = (e) => {    this.setState({        search: e.target.value    })}submitSearch = (e) => {    e.preventDefault()    console.log(this.state)}render() {    const {search} = this.state;    return (        <div>        <form onSubmit={this.submitSearch}>            <input                type='text'                onChange={this.updateSearch}                value={search}                placeholder='Search'            />            <ResultsWithQuery query={search} />        </form>        </div>    )}}

* UPDATE *Now that react-apollo@2.1 has been released there is an alternative way using render props.

https://www.apollographql.com/docs/react/essentials/get-started.html#request

This simplifies the number of components you need in this case.

import React, { Component} from 'react'import { Query } from 'react-apollo'import gql from 'graphql-tag'const SearchQuery = gql`query FindTeam($query: String!) {  search(query: $query, type: TEAM) {    name  }}`;export default class Search extends Component {constructor(props) {    super(props)    this.state = {        search: ''    }}updateSearch = (e) => {    this.setState({        search: e.target.value    })}submitSearch = (e) => {    e.preventDefault()    console.log(this.state)}render() {    const { search } = this.state;    return (        <form onSubmit={ this.submitSearch }>            <input                type='text'                onChange={ this.updateSearch }                value={ search }                placeholder='Search'            />            <Query query={SearchQuery} skip={!search} variables={{query: search}}>               {({loading, error, data}) => {                    if (loading) return null;                    if (error) throw err;                   return <h1>{data.search.namej}</h1>                }}            </Query>        </form>    )}}