Graphql Apollo useQuery();“重新蚀刻”;如果响应相同,则忽略

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(未定义)(在下面的代

我正试图使用Apollo客户端获取我的用户信息,但遇到了以下问题:

我有一个
容器
组件,负责在呈现用户数据后提取数据(而不是身份验证)。用户可能已登录或未登录,查询将返回
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();
      }}
有关本地州管理的更多信息。退房

希望这有帮助