跳转至内容
  • 版块
  • 最新
  • 热门
  • 标签
  • 积分榜
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

百得社区

  1. 主页
  2. 技术交流
  3. 大前端交流区
  4. 前端缓存?!为什么你应该在下一个项目中尝试 TanStack Query?

前端缓存?!为什么你应该在下一个项目中尝试 TanStack Query?

已定时 已固定 已锁定 已移动 大前端交流区
3 帖子 2 发布者 60 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • Jetbrains 中国J 离线
    Jetbrains 中国J 离线
    Jetbrains 中国
    写于 最后由 编辑
    #1

    一、什么是 TanStack Query?

    TanStack Query 是一个强大的数据获取库,它解决了客户端状态和服务器状态之间的鸿沟。它不是状态管理库的替代品,而是专门为异步数据管理而设计的工具。

    二、核心优势

    2.1 极简的数据获取

    即获取了数据,还缓存了数据,减轻了后台访问压力!

    // 获取角色列表(分页) 同时缓存了5分钟
    export const useRolePage = (paramsRef) => {
        return useQuery({
            queryKey: computed(() => ["sysRolePage", paramsRef.value]),
            queryFn: () => roleApi.page(paramsRef.value),
            // 缓存时间5分钟
            staleTime: 5 * 60 * 1000,
            // 翻页时保持上一次数据
            keepPreviousData: true
        })
    }
    
    // 获取全部角色列表
    export const useRoleAll = () => {
        return useQuery({
            queryKey: ["sysRoleAll"],
            queryFn: () => roleApi.all(),
            // 缓存时间5分钟
            staleTime: 5 * 60 * 1000,
        })
    }
    

    2.2 智能缓存和背景更新

    TanStack Query 自动缓存数据,并在多个组件使用相同查询时共享缓存。当数据过期时,它会在后台自动更新,用户无感知。

    增删改查会自动触发invalidateRoleCaches ,从而前端自动请求最新数据进行缓存!

    export const useSysRoleMutations = () => {
        const queryClient = useQueryClient()
    
        // 缓存失效统一方法
        const invalidateRoleCaches = async (id) => {
            // 刷新分页列表(可选全量刷新)
            await queryClient.invalidateQueries({queryKey: ['sysRolePage'], exact: false});
            // 刷新全部角色列表
            await queryClient.invalidateQueries({queryKey: ['sysRoleAll'], exact: false});
            // 刷新单条角色详情(如果提供了 id)
            if (id) {
                await queryClient.invalidateQueries({queryKey: ['sysRoleById', id]});
            }
        };
    
        // create
        const create = useMutation({
            mutationFn: (data) => roleApi.create(data),
            onSuccess: async () => {
                await invalidateRoleCaches();
            },
        });
    
        // update
        const update = useMutation({
            mutationFn: (data) => roleApi.update(data),
            onSuccess: async (_, data) => {
                await invalidateRoleCaches(data.id);
            },
        });
    
        // delete /{id}
        const deleteById = useMutation({
            mutationFn: (id) => roleApi.delete(id),
            onSuccess: async (_, id) => {
                await invalidateRoleCaches(id);
            },
        });
    
        // 批量删除
        const deleteBatch = useMutation({
            mutationFn: (ids) => roleApi.deleteBatch(ids),
            onSuccess: async () => {
                await invalidateRoleCaches();
            },
        });
        return {create, update, deleteById, deleteBatch}
    }
    

    2.3 内置乐观更新

    提供流畅的用户体验

    const mutation = useMutation({
      mutationFn: updateTodo,
      onMutate: async (newTodo) => {
        // 取消正在进行的重新获取
        await queryClient.cancelQueries({ queryKey: ['todos'] })
        
        // 保存当前状态的快照
        const previousTodos = queryClient.getQueryData(['todos'])
        
        // 乐观更新
        queryClient.setQueryData(['todos'], old => [...old, newTodo])
        
        return { previousTodos }
      },
      onError: (err, newTodo, context) => {
        // 出错时回滚
        queryClient.setQueryData(['todos'], context.previousTodos)
      }
    })
    

    "少写代码,多创造价值——TanStack Query 正是这样一个让你事半功倍的神器!"
    "用过都说好!"

    1 条回复 最后回复
    1
    • 重复过往重 离线
      重复过往重 离线
      重复过往
      写于 最后由 编辑
      #2

      好!

      这次不得不冲了!

      Jetbrains 中国J 1 条回复 最后回复
      1
      • Jetbrains 中国J 离线
        Jetbrains 中国J 离线
        Jetbrains 中国
        在 回复了 重复过往 最后由 编辑
        #3

        @重复过往 你是懂水贴的,啊哈哈

        1 条回复 最后回复
        1

        Powered by NodeBB | Contributors
        • 登录

        • 登录或注册以进行搜索。
        • 第一个帖子
          最后一个帖子
        0
        • 版块
        • 最新
        • 热门
        • 标签
        • 积分榜
        • 用户
        • 群组