Graphql Apollo useQuery();“重新蚀刻”;如果响应相同,则忽略
我正试图使用Apollo客户端获取我的用户信息,但遇到了以下问题: 我有一个Graphql Apollo useQuery();“重新蚀刻”;如果响应相同,则忽略,graphql,apollo,react-apollo,apollo-client,react-apollo-hooks,Graphql,Apollo,React Apollo,Apollo Client,React Apollo Hooks,我正试图使用Apollo客户端获取我的用户信息,但遇到了以下问题: 我有一个容器组件,负责在呈现用户数据后提取数据(而不是身份验证)。用户可能已登录或未登录,查询将返回viewer=null或viewer={…usersProps} 容器发出请求const{data,refetch}=useQuery(查看器),成功接收响应并将其保存在数据属性中,我使用该属性读取.viewer,并将其设置为我的当前用户 然后用户可以注销,一旦他们这样做,我将清除容器的用户属性setUser(未定义)(在下面的代
容器
组件,负责在呈现用户数据后提取数据(而不是身份验证)。用户可能已登录或未登录,查询将返回viewer=null
或viewer={…usersProps}
容器发出请求const{data,refetch}=useQuery(查看器)
,成功接收响应并将其保存在数据
属性中,我使用该属性读取.viewer
,并将其设置为我的当前用户
然后用户可以注销,一旦他们这样做,我将清除容器的用户属性setUser(未定义)
(在下面的代码中未显示,不重要)
当我尝试重新登录时出现问题:调用refetch
会触发graphql
http请求,但由于它返回的数据与上次初始登录时返回的数据相同-useQuery()
忽略它,并且不更新数据。从技术上讲,不可能有更新,数据是一样的。所以我的代码setUser(查看器)代码>不会第二次执行,并且用户会在登录页面上点击
const { data, refetch } = useQuery<Viewer>(VIEWER);
const viewer = data && data.viewer;
useEffect(() => {
if (viewer) {
setUser(viewer);
}
}, [ viewer ]);
const{data,refetch}=useQuery(查看器);
const viewer=data&&data.viewer;
useffect(()=>{
如果(查看器){
设置用户(查看器);
}
},[观众];
具有相同响应ignore的查询几乎是有意义的,因此我尝试了不同的方法,使用回调:
const { refetch } = useQuery<Viewer>(VIEWER, {
onCompleted: data => {
if (data.viewer) {
setUser(data.viewer);
}
}
});
const{refetch}=useQuery(查看器{
未完成:数据=>{
如果(data.viewer){
setUser(data.viewer);
}
}
});
在这里,我完全希望Apollo调用onCompleted
回调,无论是否使用相同的数据。。。但事实并非如此。所以我有点纠结于此-我如何让阿波罗对我的查询的refetch
做出反应,这样我就可以在我的容器的状态下重新填充用户
。
客户
登录页
const IS_LOGGED_IN = gql`
query IsUserLoggedIn {
isLoggedIn @client
}
`;
function IsLoggedIn() {
const { data } = useQuery(IS_LOGGED_IN);
return data.isLoggedIn ? <Pages /> : <Login />;
}
旁观者
onLogout={() => {
client.writeData({ data: { isLoggedIn: false } });
localStorage.clear();
}}
有关本地州管理的更多信息。退房
希望这有帮助 这是一个阿波罗的储藏室派上用场的场景。
客户
登录页
const IS_LOGGED_IN = gql`
query IsUserLoggedIn {
isLoggedIn @client
}
`;
function IsLoggedIn() {
const { data } = useQuery(IS_LOGGED_IN);
return data.isLoggedIn ? <Pages /> : <Login />;
}
旁观者
onLogout={() => {
client.writeData({ data: { isLoggedIn: false } });
localStorage.clear();
}}
有关本地州管理的更多信息。退房
希望这有帮助