reactjs - Apollo graphql 使用 React hooks 进行突变轮询

标签 reactjs graphql react-hooks react-apollo

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

我尝试使用钩子(Hook)按间隔运行突变,但这实际上不起作用,因为 useAuth 钩子(Hook)同时在多个组件中使用,因此最终会为每个组件创建一个间隔。

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]);

 ...
}

最佳答案

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

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

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;
}

然后像这样更改应用程序定义,

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

通过将其放置在提供程序中(位于树的较高位置),useEffect 可能只会在应用程序加载时以及 useInterval 触发时运行。如果代码只是在功能钩子(Hook)中,它可能会频繁更改(组件安装/卸载、 Prop 更改等)。

关于reactjs - Apollo graphql 使用 React hooks 进行突变轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63033467/

相关文章:

reactjs - 在嵌套的功能组件 React Native 中键入 TextInput 时键盘关闭

javascript - 获取 JSON 并遍历 react-native 中的值

javascript - 在 useState 中更新 Map 时避免重新渲染组件

javascript - React Native 元素上的设置键

html - 无法在导航栏 html 中显示 Logo

caching - Apollo 服务器端缓存 : What is cache keyed on?

GraphQL 中的二进制

webpack - 如何使用 webpack 导入 .graphql 文件

reactjs - React Hooks - 在不违反 Hooks 规则的情况下返回 useContext

reactjs - React Native 将大型代码移动到单独的文件中 - 它是一个钩子(Hook)吗?