将变量从输入传递到 GraphQL 搜索调用

Posted

技术标签:

【中文标题】将变量从输入传递到 GraphQL 搜索调用【英文标题】:Pass variable from input to GraphQL search call 【发布时间】:2018-08-20 15:58:27 【问题描述】:

我正在学习graphql和react-apollo。我在我的代码中设置了一个搜索查询。我不确定如何将变量从我的代码(即this.state.search)传递给我的 grapnql 调用。

我看了很多答案,包括this one,但似乎有点不同。

The docs also don't seem 提供有关如何将状态用作变量的任何指导。

我的代码如下。

谁能建议如何连接这两者?

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

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'    
        />
      </form>
    )
  



export default graphql(gql`

  search(query: "Manchester", type: TEAM) 
    name
  
`)(Search)

【问题讨论】:

【参考方案1】:

您需要将其拆分为至少两个组件。一个保存用户搜索的状态,然后另一个通过获取道具实际进行查询。此外,如果表单在未输入内容的情况下提交,您可以让 apollo 高阶组件跳过查询。

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>

    )


* 更新 * 现在 react-apollo@2.1 已经发布,还有一种使用渲染道具的替代方法。

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

这简化了您在这种情况下所需的组件数量。

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>
    )


【讨论】:

这是唯一的方法吗? 将 prop 作为查询参数传递给 apollo 高阶组件?是的,这是根据用户输入编写动态查询的唯一方法。 如何传递道具(使用 redux,无论是上下文)取决于你。 感谢您的回答,您必须为此创建一个额外的组件似乎有点矫枉过正

以上是关于将变量从输入传递到 GraphQL 搜索调用的主要内容,如果未能解决你的问题,请参考以下文章

无法将 GraphQL 自定义类型作为 Postman 变量

在 GraphQL 查询中传递自定义变量

如何将用户输入从节点服务器传递到外部 api 调用?

将输入变量从PowerShell表单传递到cmdlet参数会导致空白数据

Graphql,react-apollo如何在加载组件状态时将变量传递给查询

ReactJS/Javascript/Graphql/React-apollo:传递查询变量