reactjs - ApolloGraphQL 和 React:组件重新挂载时避免调用查询和订阅?
问题描述
我有一个这样设置的 React 路由器:
<ApolloProvider client={ApolloClient}>
<Router history={browserHistory}>
<React.Suspense fallback={<p></p>}>
<ErrorBoundary>
<AppStateProvider>
<Route render={(routeProps) =>
<TopNav
history={routeProps.history}
match={routeProps.match}
/>
}/>
<Switch>
<Route exact path="/" render={(routeProps) =>
<myComponent history={routeProps.history} match={routeProps.match}
/>
}/>
[.....MORE COMPONENTS.....]
</Switch>
<Route render={(routeProps) =>
<BottomNav history={routeProps.history} match={routeProps.match}
/>
}/>
</AppStateProvider>
</ErrorBoundary>
</React.Suspense>
</Router>
</ApolloProvider>
该<TopNav>
组件包含一个 Apollo 查询和订阅:
function TopNav(props) {
[.......]
let unsubscribeFromIncomingMessages = null; <=== re-runs when user changes routes
[.......]
<Query query={INCOMING_MESSAGES_QUERY}
variables={{"localUserId": Meteor.userId()}}>
{({subscribeToMore, loading, error, data, refetch}) => {
if (loading) {
return (
<div key="divLoading"></div>);
} else {
}
if (error) {
return (
<div key="divError"></div>);
}
if (!unsubscribeFromIncomingMessages) {
unsubscribeFromIncomingMessages = subscribeToMore({
document: INCOMING_MESSAGES_SUBSCRIPTION_QUERY,
variables: {
"localUserId": Meteor.userId()
},
updateQuery: (prev, {subscriptionData}) => {
[.....HANDLE UPDATE DATA.....]
}
});
}
return (
<>
</>
);
}}
</Query>
当客户端在我的应用程序中提出另一条路线时,<TopNav>
会重新安装,这很好,但<Query>
订阅又会重新运行。
解决这个问题的正确方法是什么?
更新
每次我导航到客户端上的新页面时,我的服务器上的订阅查询中的断点都会被命中。
这应该发生吗?如果是,那就好!但如果不是——我想知道这一点。:)
解决方案
将变量设为全局unsubscribeFromIncomingMessages
并添加fetchPolicy='cache-first'
.<Query>
编辑:哎呀,我想我应该预料到这一点。无论您将参考存储在何处,订阅都会在您离开路线后立即停止。
subscribeToMore
每次进入路线时都会运行。除非您需要能够停止订阅,否则您不需要记录对它的引用。在进入时设置订阅并不昂贵。
如果您需要在不同的路由中激活相同的订阅,您也需要在这些路由上运行它。
我的理解是,订阅不会每次都重新订阅,它只是在上次订阅具有相同变量等的地方停止。
推荐阅读
- python - 连接一次smtp服务器,长期发很多邮件可以吗?
- python - Python将输出插入现有excel文件的新行
- android - 推送通知android中的1小时间隔
- c# - 如何获取以像素为单位的字符串长度以使字符串在合并单元格中居中?
- arrays - 当我在 TabView 上快速滑动时如何更改变量
- arrays - 为for循环添加2个条件
- discord.py - 像滑动页面一样编辑机器人的消息,discord.py
- python-3.x - 具有多个“连续动作”的深度强化学习
- laravel - 已解决:推送错误:提供了未知的“Pusher_App_Id”
- javascript - 如何在 React 中测试 Bambora iframe 的事件监听器?