从 React 客户端中调用 graphQL 查询
Calling a graphQL query from within react client
我正在尝试 return 所有用户交易的列表,但我似乎无法正确调用 graphQL 查询。我在底部定义了查询,并试图在 refreshData() 中调用它。我错过了什么?
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);
使用 graphql
高阶组件
您调用的 graphql
函数 return 是一个高阶组件,然后可用于包装另一个 React 组件。它不是 return 可以像您尝试做的那样等待的承诺。
您已经(或多或少)正确地使用了它:
export default graphql(getTransactionsQuery)(App)
当你像这样用 graphql
HOC 包装你的组件时,你的组件会收到一个 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
以确定查询是否仍在进行中。请查看 Apollo 文档 (here) 以获取更多示例。
获取带有变量的查询
您的查询使用变量,因此需要将这些变量与其一起发送。您需要将它们作为选项传递给 graphql
函数,如下所示:
导出默认 graphql(getTransactionsQuery, { options: { variables: { id: 'youridhere' } } })(App)
Options 通常是传递一个对象,但也可以传递一个函数。此函数将 props
作为参数,因此您可以根据需要从 props 派生变量。例如:
const options = props => ({ variables: { id: props.id } })
export default graphql(getTransactionsQuery, { options })(App)
查看 here 了解更多信息。
正在重新获取数据
由于 Apollo 为您完成了繁重的工作,因此无需按钮即可从您的服务器获取数据。但是如果你需要重新获取你的数据,你可以通过调用 props.data.refetch()
传递给你的组件的 data
属性来实现。您可以阅读有关重新获取的更多信息 here.
我正在尝试 return 所有用户交易的列表,但我似乎无法正确调用 graphQL 查询。我在底部定义了查询,并试图在 refreshData() 中调用它。我错过了什么?
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);
使用 graphql
高阶组件
您调用的 graphql
函数 return 是一个高阶组件,然后可用于包装另一个 React 组件。它不是 return 可以像您尝试做的那样等待的承诺。
您已经(或多或少)正确地使用了它:
export default graphql(getTransactionsQuery)(App)
当你像这样用 graphql
HOC 包装你的组件时,你的组件会收到一个 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
以确定查询是否仍在进行中。请查看 Apollo 文档 (here) 以获取更多示例。
获取带有变量的查询
您的查询使用变量,因此需要将这些变量与其一起发送。您需要将它们作为选项传递给 graphql
函数,如下所示:
导出默认 graphql(getTransactionsQuery, { options: { variables: { id: 'youridhere' } } })(App)
Options 通常是传递一个对象,但也可以传递一个函数。此函数将 props
作为参数,因此您可以根据需要从 props 派生变量。例如:
const options = props => ({ variables: { id: props.id } })
export default graphql(getTransactionsQuery, { options })(App)
查看 here 了解更多信息。
正在重新获取数据
由于 Apollo 为您完成了繁重的工作,因此无需按钮即可从您的服务器获取数据。但是如果你需要重新获取你的数据,你可以通过调用 props.data.refetch()
传递给你的组件的 data
属性来实现。您可以阅读有关重新获取的更多信息 here.