Динамическая строка поиска с переменной в запросе GraphQL

#reactjs #graphql #grandstack

#reactjs #graphql #grandstack

Вопрос:

У меня есть следующий запрос, который хорошо работает на внутренней стороне:

 {
  fuzzyArticleByTitle(searchString:"tiktok"){
    title
  }
}
  

Результатом является совпадение нескольких заголовков статей со строкой «tiktok».

Я хотел бы закодировать динамическую панель поиска во интерфейсной части с помощью React, используя переменную для searchString.

Я попробовал это:

 import React, { Component} from 'react'
import { Query } from 'react-apollo'
import gql from 'graphql-tag'

const SearchQuery = gql`
query {
    fuzzyArticleByTitle($searchString: String){
        title
  }
}
`;

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.title}</h1>
                }}
            </Query>
        </form>
    )
}
}
  

Это не работает. Где я ошибаюсь?

Может быть, есть лучший способ сделать это

Комментарии:

1. Что console.log(this.state) выводится при нажатии кнопки отправки?

2. У меня ошибка: анонимная функция. Я использую шаблонный проект, чтобы узнать: github.com/grand-stack/grand-stack-starter Так что, возможно, я поместил этот код не в то место

Ответ №1:

Вы должны объявить переменную в заголовке запроса, например

 query SearchArticles($searchString: String) {
    fuzzyArticleByTitle(searchString: $searchString){
        title
  }
}
  

а затем используйте это конкретное имя переменной (вы можете выбрать любое имя в объявлении после $ ) в Apollo:

 <Query query={SearchQuery} skip={!search} variables={{searchString: search}}>
  {({loading, error, data}) => {
    if (loading) return null;
    if (error) throw err;
     return <h1>{data.search.title}</h1>
  }}
</Query>