【问题标题】:Unnecessary refetch is triggered after mutation React Apollo突变 React Apollo 后触发了不必要的重新获取
【发布时间】:2020-10-22 01:20:18
【问题描述】:

我正在使用 React Apollo 和 GraphQL 构建一个小型 ToDo 列表应用程序。为了添加新的 ToDo 项目,我单击“添加”按钮,将我重定向到具有表单的不同 URL。在提交表单时,我执行mutation 并使用update 函数更新缓存。缓存已成功更新,但当我返回带有 ToDo 列表的主页时,该组件会触发一个 http 请求以从服务器获取 ToDo 列表。如何避免该额外请求并使ToDoList 组件从缓存中提取数据?

我的AddToDo 组件:

const AddToDo = () => {
  const { inputValue, handleInputChange } = useFormInput();

  const history = useHistory();
  const [addToDo] = useMutation(ADD_TODO);

  const onFormSubmit = (e) => {
    e.preventDefault();
    addToDo({
      variables: { title: inputValue },
      update: (cache, { data: { addToDo } }) => {
        const data = cache.readQuery({ query: GET_TODO_LIST });
        cache.writeQuery({
          query: GET_TODO_LIST,
          data: {
            todos: [...data.todos, addTodo],
          },
        });
        history.push("/");
      },
    });
  };

  return (
    ...
  );
};

还有ToDoList组件

 const ToDoList = () => {
 const { data, loading, error } = useQuery(GET_TODO_LIST);

  if (loading) return <div>Loading...</div>;
  if (error || !loading) return <p>ERROR</p>;
  

  return (
  ...
  );
};

【问题讨论】:

    标签: reactjs graphql react-apollo apollo-client


    【解决方案1】:

    按预期工作。

    为什么没有必要?另一个页面,新组件,新鲜的useQuery hook ... default(?) fetchPolicy "cache-and-network" 将使用缓存数据(如果存在)来呈现(快速,一次),但也会请求确保当前数据用过。

    您可以强制"cache-only",但如果缓存中没有数据,它可能会失败,它不会发出请求。

    【讨论】:

    • 但是当我返回(手动或使用 history.push() )时,所有最新项目都存储在缓存中,这就是我想避免该网络请求的原因
    • 真的值得特别对待吗?你真的需要特殊的应用程序状态来标记它是新鲜的/这次使用“仅缓存”吗?这种状态应该保持多久? 10秒还是2分钟?其他客户/用户可以在您的页面/视图更改期间更改此/一些常见/共享数据。
    • 好吧,我只是想发现选项。当然,这种行为并不总是合理的,但很高兴知道您可以使用特定工具做什么。
    猜你喜欢
    • 2019-03-26
    • 2018-03-05
    • 2022-01-12
    • 2021-11-18
    • 2018-08-12
    • 2019-10-22
    • 2019-10-15
    • 2019-12-05
    • 2018-02-21
    相关资源
    最近更新 更多