使用 Query 组件第二次安装组件时,Apollo 重新获取查询?
Apollo refetch query when component mounts for a 2nd time with Query component?
我需要在安装组件时获取查询。第一次安装组件时会自动发生。
但是,如果组件的页面也被导航,则用户导航到其他地方,然后 returns 到该页面,默认情况下不会重新获取查询。
使用 Apollo 的 HOC,您可以通过在 componentDidMount
上调用 refetch
函数来解决这个问题
class GetMessages extends React.Component {
componentDidMount() {
if (!this.props.MESSAGES.loading) {
this.props.MESSAGES.refetch();
}
}
render() {
const { loading, error, messages, me } = this.props.MESSAGES;
if (loading) return <p>loading...</p>
if (error) console.error(error);
return <Messages messages={messages} />;
}
}
export default graphql(MESSAGE_QUERY, { name: "MESSAGES" })(GetMessages);
但是我知道建议改用查询组件。 Query 组件可以实现同样的目的吗?
如果你想使用 <Query>
组件,你必须创建一个容器 class 并用它包装当前的 class 并将数据作为子组件的 prop 传递class。所以一个例子是这样的。
export default class MyPageScreenContainer extends React.Component {
render() {
return (
<ApolloConsumer>
{(client) => (
<Query query={GET_USER} fetchPolicy="network-only">
{({data, loading, error, refetch}) => {
if (loading) {
return <Text>Loading...</Text>
}
return (
<Mutation mutation={PUT_REQUEST}>
{(putRequest) => {
return (
<MyPageScreen data={data.getUser} navigation={this.props.navigation}
refetchProfile={refetch}
putRequest={putRequest}
client={client}/>
)
}}
</Mutation>
)
}}
</Query>
)}
</ApolloConsumer>
)
}
}
当然,这种方法的问题在于它与使用 graphql HOC 几乎相同。此外,当您从容器中重新获取数据时,您必须使用相同的道具更新子组件中的状态,以确保重新渲染发生。
我需要在安装组件时获取查询。第一次安装组件时会自动发生。
但是,如果组件的页面也被导航,则用户导航到其他地方,然后 returns 到该页面,默认情况下不会重新获取查询。
使用 Apollo 的 HOC,您可以通过在 componentDidMount
refetch
函数来解决这个问题
class GetMessages extends React.Component {
componentDidMount() {
if (!this.props.MESSAGES.loading) {
this.props.MESSAGES.refetch();
}
}
render() {
const { loading, error, messages, me } = this.props.MESSAGES;
if (loading) return <p>loading...</p>
if (error) console.error(error);
return <Messages messages={messages} />;
}
}
export default graphql(MESSAGE_QUERY, { name: "MESSAGES" })(GetMessages);
但是我知道建议改用查询组件。 Query 组件可以实现同样的目的吗?
如果你想使用 <Query>
组件,你必须创建一个容器 class 并用它包装当前的 class 并将数据作为子组件的 prop 传递class。所以一个例子是这样的。
export default class MyPageScreenContainer extends React.Component {
render() {
return (
<ApolloConsumer>
{(client) => (
<Query query={GET_USER} fetchPolicy="network-only">
{({data, loading, error, refetch}) => {
if (loading) {
return <Text>Loading...</Text>
}
return (
<Mutation mutation={PUT_REQUEST}>
{(putRequest) => {
return (
<MyPageScreen data={data.getUser} navigation={this.props.navigation}
refetchProfile={refetch}
putRequest={putRequest}
client={client}/>
)
}}
</Mutation>
)
}}
</Query>
)}
</ApolloConsumer>
)
}
}
当然,这种方法的问题在于它与使用 graphql HOC 几乎相同。此外,当您从容器中重新获取数据时,您必须使用相同的道具更新子组件中的状态,以确保重新渲染发生。