代码之家  ›  专栏  ›  技术社区  ›  vanBuren1738

从react客户端内调用graphQL查询

  •  3
  • vanBuren1738  · 技术社区  · 7 年前

      async refreshData() {
        const allTransactions = await graphql(getTransactionsQuery);
        console.log(allTransactions);
        this.setState({
          transactions: allTransactions
        });
      }
    
      render() {
        const transactionsFromState = this.state.transactions;
        const transactions = transactionsFromState.map((transaction) =>
          <li key={transaction.id}>{transaction}</li>
        );
        return (
          <div className="App">
            <button onClick={() => this.refreshData()}> Refresh Data </button>
            <ul>{ transactions }</ul>
          </div>
        );
      }
    }
    
    const getTransactionsQuery = gql`
      query getTransactions($id: ID!) {
        transactions(userId: $id){Transaction}
      }
    `;
    
    //change User ID use context.user.id
    export default graphql(getTransactionsQuery)(App);
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Daniel Rearden    7 年前

    使用 graphql 高阶分量

    这个 您调用的函数返回一个高阶组件,然后可以使用该组件包装另一个React组件。它不会像你试图做的那样回报一个可以等待的承诺。

    您已经在这里(或多或少)正确地使用了它:

    export default graphql(getTransactionsQuery)(App)
    

    当您用 图形QL 就像这样,您的组件接收一个 data

    render() {
      const { transactions } = this.props.data 
      const transactionItems = transactions
        ? transactions.map(t => <li key={t.id}>{t}</li>)
        : null
      return (
        <div className="App">
          <button onClick={() => this.refreshData()}> Refresh Data </button>
          <ul>{ transactionItems }</ul>
        </div>
      );
    }
    

    data.transactions 将在获取查询之前最初未定义,因此在渲染函数中注意这一点很重要。您也可以检查 data.loading 以确定查询是否仍在进行中。请检查阿波罗文件( here )更多示例。

    图形QL 功能如下:

    导出默认graphql(getTransactionsQuery,{options:{variables:{id:'youridhere'}}})(应用程序)

    选项通常传递给对象,但也可以传递给函数。此函数需要 props

    const options = props => ({ variables: { id: props.id } })
    export default graphql(getTransactionsQuery, { options })(App)
    

    检查 here 了解更多信息。

    重新蚀刻数据

    数据 通过调用传递到组件的道具 props.data.refetch() . 您可以阅读有关重新蚀刻的更多信息 here .