我最近开始学习反应,遇到了一些我不理解的东西。因此,当我声明一个组件时,我也在构造函数中声明了一个属性。然后,在执行第一个查询(我正在使用Apollo客户端-GraphQL)之后,我要将结果(我知道它将始终是电子邮件)存储在声明的属性中,以便可以将其用作第二个查询中的参数。
应用程序逻辑是,我想显示给定电子邮件的所有订单,但首先我得到带有查询的电子邮件。
这里是代码:
export default class Orders extends Component {
constructor(){
super();
this.email = '';
}
render() {
return (
<div>
<Query query = { GET_MAIL_QUERY }>
{({data, loading}) => {
if (loading) return "Loading...";
this.email = data.me.email;
return <h1>{this.email}</h1>
}}
此时将返回包含电子邮件的标头,因此一切正常。但是,当我执行第二个查询(或尝试在第二个标题中显示电子邮件)时,似乎值存储不正确。
</Query>
<h1>{this.email}</h1>
<Query query = { GET_ORDERS_QUERY }
variables = {{
email: this.email
}}>
{({data, loading}) => {
if (loading) return "Loading...";
console.log(data);
let orders = data.ordersByEmail.data;
console.log(orders);
return orders.map(order =>
<div>
<h1>{order.date}</h1>
<h1>{order.price}</h1>
<h1>{order.conference.conferenceName}</h1>
<h1>{order.user.email}</h1>
<br></br>
</div>)
}}
</Query>
</div>
)
}
}
const GET_MAIL_QUERY = gql`
query getMyMail{
me{
email
}
}
`;
const GET_ORDERS_QUERY = gql`
query getOrdersByEmail($email: String!) {
ordersByEmail(email: $email) {
data {
gid
date
price
user {
email
}
conference{
conferenceName
}
}
}
}
`;
我希望对此进行解释,也许还可以找到解决方案(存储从查询返回的值以在另一个查询中使用)
感谢您的期待:)
根据我的经验,应该从useQuery
导入的@apollo/react-hooks
与功能组件一起使用,因为它易于使用,它使您的代码更清晰]
如果您想将<Query/>
组件与类组件一起使用,也可以。但是,如果要存储从服务器接收到的数据,则应在构造函数的状态下创建一个变量,并且要更新为状态时,应使用this.setState({email: data.me.email})
。不要使用this.state.email = data.me.email
,它是反模式,当您使用它来更新状态时,React不会触发重新渲染。
这是代码:
import React, { useState } from 'react'
import gql from 'graphql-tag'
import { useQuery, useMutation } from '@apollo/react-hooks'
const GET_MAIL_QUERY = gql`
query getMyMail {
me {
email
}
}
`
const GET_ORDERS_QUERY = gql`
query getOrdersByEmail($email: String!) {
ordersByEmail(email: $email) {
data {
gid
date
price
user {
email
}
conference {
conferenceName
}
}
}
}
`
const Orders = () => {
const [email, setEmail] = useState('')
const { data: getMailQueryData, loading, error } = useQuery(GET_MAIL_QUERY, {
onCompleted: data => {
setEmail(data.me.email)
},
onError: err => alert(err),
})
const { data: getOrdersQueryData } = useQuery(GET_ORDERS_QUERY, {
variables: { email: email },
})
if (loading) return <div>Loading...</div>
if (error) return <div>Error...</div>
return ...
}