【问题标题】:Apollo graphql mutation polling with react hooks带有反应钩子的 Apollo graphql 突变轮询
【发布时间】:2020-11-11 22:51:30
【问题描述】:

我有一个突变,用于登录我的应用程序。我想每 5 分钟重新运行一次登录突变,以检查他们的个人资料是否有更新。 useQuery 有一个 pollingInterval 选项,但 useMutation 没有。

我尝试使用钩子在间隔上运行突变,但这并没有真正起作用,因为 useAuth 钩子同时在多个组件中使用,所以它最终会为每个组件创建一个间隔。

function useInterval(callback: () => any, delay: number | null) {
  const savedCallback = useRef<any>();
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);
  useEffect(() => {
    function tick() {
      savedCallback.current();
    }
    if (delay !== null) {
      const id = setInterval(tick, delay);
      return () => clearInterval(id);
    }
  }, [delay]);
}


function useAuth(){
  const [login,{data:loginData} = useMutation(gql`
   ...
  `);

  useInterval(() => login(Cookies.get(TOKEN_NAME),1000*60*5);

  return login;
}

function App(){
 const login = useAuth();
 useEffect(() => {
   login(Cookies.get(TOKEN_NAME));
 },[login]);

 ...
}

【问题讨论】:

    标签: reactjs graphql react-hooks react-apollo


    【解决方案1】:

    您要做的是使用位于您的 React 组件树中高处的 Provider 创建一个上下文。这是文档,context docs。

    首先您需要创建提供程序,可能在您创建 useAuth 挂钩的同一位置。

    import React, {useContext, createContext} from 'react';
    
    const AuthContext = createContext();
    
    function AuthProvider({ children }) {
      const [login,{data:loginData} = useMutation(gql`
       ...
      `);
    
      useInterval(() => login(Cookies.get(TOKEN_NAME),1000*60*5);
    
      return (
        <AuthContext.Provider value={login}>{children}</AuthContext.Provider>
      )
    }
    
    function useAuth(){
      const context = useContext(AuthContext);
      return context;
    }
    

    然后像这样更改App定义,

    function App() {
      return (
        ...
        <AuthProvider>
          ...
        </AuthProvider>
        ...
      );
    }
    

    通过将它放置在提供程序中(在树的高处),useEffect 可能只会在应用加载和 useInterval 触发时运行。如果代码只是在功能挂钩中,它可能会频繁更改(组件挂载/卸载、prop 更改等)。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2020-06-08
      • 2021-03-11
      • 2021-06-14
      • 2020-11-04
      • 2020-04-24
      • 2020-12-12
      • 2019-01-28
      相关资源
      最近更新 更多