You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用React Query通过独立API调用结果修改现有数据

如何使用React Query通过独立API调用结果修改现有数据

嘿,我太懂你这个场景了!社交板块里帖子默认显示几条回复,点击加载更多再拉取完整回复,这简直是现在社交产品的标配需求。用React Query来实现这个需求特别顺手,我给你一步步拆解怎么搞:

先对齐咱们的场景

你做的ReactJS应用里有个社交板块,用户能发动态、回复别人的动态。现在有个API返回帖子列表,每条帖子带id、内容和前2条回复;用户点按钮后,调用另一个独立API获取该帖子的所有剩余回复,然后把这些回复更新到原来的帖子数据里——完全get到了!

那咱们直接上可落地的代码方案:

第一步:初始化获取帖子列表的Query

首先你得用useQuery把初始的帖子列表拉下来,一定要给这个Query设个唯一的queryKey(比如['posts']),这是后面能修改缓存数据的关键。代码大概长这样:

import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';

// 模拟你的获取帖子列表API请求
const fetchPosts = async () => {
  const response = await fetch('/api/posts');
  return response.json();
};

function SocialFeed() {
  const queryClient = useQueryClient();
  // 拉取初始帖子列表
  const { data: posts } = useQuery({
    queryKey: ['posts'],
    queryFn: fetchPosts,
  });

第二步:实现加载更多回复并更新现有数据

这里的核心是用React Query的queryClient.setQueryData方法,它能直接修改咱们之前缓存的帖子数据。我推荐用useMutation来包裹加载回复的异步操作,还能顺便处理加载状态,避免用户重复点击:

// 模拟获取单帖所有回复的API请求
const fetchAllRepliesForPost = async (postId) => {
  const response = await fetch(`/api/posts/${postId}/all-replies`);
  return response.json();
};

// 用useMutation管理加载回复的异步逻辑
const { mutate: loadAllReplies, isLoading } = useMutation({
  mutationFn: fetchAllRepliesForPost,
  // 请求成功后更新缓存里的帖子数据
  onSuccess: (fullReplies, postId) => {
    queryClient.setQueryData(['posts'], (oldPosts) => {
      if (!oldPosts) return [];
      // 找到对应的帖子,把回复替换成完整列表
      return oldPosts.map(post => 
        post.id === postId 
          ? { ...post, replies: fullReplies } 
          : post
      );
    });
  },
});

第三步:渲染帖子和加载按钮

最后把帖子渲染出来,给符合条件的帖子(比如当前只显示了2条回复)加上“加载更多”按钮,绑定咱们刚才写的方法:

return (
    <div className="social-feed">
      {posts?.map(post => (
        <div key={post.id} className="post-card">
          <p className="post-content">{post.content}</p>
          <div className="replies-section">
            {post.replies.map(reply => (
              <p key={reply.id} className="reply">
                {reply.content}
              </p>
            ))}
            {/* 只有当当前显示2条回复时,才显示加载按钮 */}
            {post.replies.length === 2 && (
              <button 
                onClick={() => loadAllReplies(post.id)}
                disabled={isLoading}
                className="load-more-btn"
              >
                {isLoading ? '加载中...' : '查看更多回复'}
              </button>
            )}
          </div>
        </div>
      ))}
    </div>
  );
}

export default SocialFeed;

额外唠两句

用useMutation的好处是它自带加载状态管理,能防止用户重复点击按钮;而setQueryData会自动触发组件重新渲染,根本不用你手动维护state,React Query会帮你把缓存和视图同步的事情搞定,特别省心。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:44:31