【发布时间】:2019-08-26 17:40:19
【问题描述】:
我有一个这样设置的 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> 和订阅会重新运行。
解决这个问题的正确方法是什么?
更新
订阅查询中我的服务器上的断点,每次我导航到客户端上的新页面时都会被命中。
这应该会发生吗?如果是,那就好!但如果不是——我想知道这一点。 :)
【问题讨论】:
标签: reactjs react-router apollo react-apollo apollo-client