🍍Pinia党福音,🍍Pinia伴侣:🍍pinia-colada

前言

pinia-colada 是一个基于 Pinia 的状态管理库的插件。官方的功能介绍如下:

  • ⚡️ 自动缓存:智能的客户端缓存,支持请求去重
  • 🗄️ 异步状态管理:轻松处理任何异步状态
  • 🔌 插件系统:强大的插件系统
  • 乐观更新:轻松实现乐观更新
  • 💡 合理的默认配置:提供合理的默认值,同时支持完全自定义
  • 开箱即用的插件:一组可组合的函数,用于处理数据获取
  • 📚 TypeScript 支持:完全支持 TypeScript
  • 💨 小体积:基础大小约 2kb,完全支持 Tree Shaking
  • 📦 零依赖:除了 Pinia 外,没有任何其他依赖
  • ⚙️ SSR 支持:开箱即用的服务端渲染支持

pinia-colada 的核心是: useQueryuseMutation。此外,它还提供了 defineQuerydefineMutation,用于在 Pinia Store 中定义查询和修改操作。

vue-use等库提供的useAxios类库不同,pinia-colada是借助 pinia 缓存请求,自带缓存。

官方库:github.com/posva/pinia... 官方文档:pinia-colada.esm.dev/

往期精彩推荐

useQuery

静态查询

useQuery 用于管理异步数据获取,支持缓存、加载状态和错误处理。以下是 useQuery 的基本数据格式:

javascript 复制代码
import { useQuery } from '@pinia/colada';

const {
  // 主要查询属性
  state,          // 包含 data、error、status 等状态
  asyncStatus,    // 异步状态(loading、error、success 等)
  refresh,        // 手动刷新数据
  refetch,        // 重新获取数据(忽略缓存)
  // 便捷别名
  error,          // 错误信息
  data,           // 请求成功后的数据
  status,         // 当前状态(idle、loading、success、error)
  isLoading,      // 是否正在加载
  isPending,      // 是否处于等待状态
  isPlaceholderData, // 是否为占位数据
} = useQuery({
  key: ['todos'], // 查询的唯一标识
  query: () => fetch('/api/todos').then((res) => res.json()), // 查询函数
});

动态查询

key 不仅可以是静态数组,还可以是函数。当 key 为函数时,可以根据动态参数生成唯一的查询标识。

javascript 复制代码
const todoId = ref(1);

const {
  data,
  isLoading,
} = useQuery({
  key: () => ['todo', todoId.value], // 动态生成 key
  query: () => fetch(`/api/todos/${todoId.value}`).then((res) => res.json()),
});

// 当 todoId 变化时,useQuery 会自动重新获取数据
todoId.value = 2;

动态 key 的作用:

  • key 变化时,useQuery 会自动重新执行查询函数。
  • 适合需要根据参数动态获取数据的场景(如分页、筛选、详情页等)。

如果在分页的场景中使用时,可以使用 placeholderData 防止清空数据!

js 复制代码
const { state } = useQuery({
  key: () => ['contacts', Number(route.query.page) || 1],
  query: () =>
    fetch(`/api/contacts?page=${Number(route.query.page) || 1}`).then((res) => res.json()),
  placeholderData: (previousData) => previousData,
})

defineQuery

defineQuery 用于在 Pinia Store 中定义查询操作。它返回一个可以在 Store 中使用的查询函数。

基本用法

javascript 复制代码
import { defineStore } from 'pinia';
import { defineQuery } from '@pinia/colada';

export const useTodoStore = defineStore('todo', () => {
  const fetchTodos = defineQuery({
    key: ['todos'],
    query: () => fetch('/api/todos').then((res) => res.json()),
  });

  return {
    fetchTodos,
  };
});

在组件中使用

javascript 复制代码
import { useTodoStore } from '@/stores/todoStore';

const todoStore = useTodoStore();
const { data, isLoading } = todoStore.fetchTodos();

动态查询

javascript 复制代码
const fetchTodoById = defineQuery({
  key: (id) => ['todo', id], // 动态生成 key
  query: (id) => fetch(`/api/todos/${id}`).then((res) => res.json()),
});

// 在组件中使用
const { data, isLoading } = fetchTodoById(todoId.value);

useMutation

基本用法

useMutation 用于请求副作用,管理数据修改操作(如 POST、PUT、DELETE 请求)。以下是 useMutation 的基本用法:

javascript 复制代码
import { useMutation } from '@pinia/colada';

const {
  mutate,          // 触发修改操作的函数
  state,           // 包含 data、error、status 等状态
  asyncStatus,     // 异步状态(loading、error、success 等)
  reset,           // 重置状态
  // 便捷别名
  error,           // 错误信息
  data,            // 请求成功后的数据
  status,          // 当前状态(idle、loading、success、error)
  isLoading,       // 是否正在加载
  isPending,       // 是否处于等待状态
} = useMutation({
  mutation: (newTodo) => fetch('/api/todos', {
    method: 'POST',
    body: JSON.stringify(newTodo),
  }).then((res) => res.json()),
});

// 触发修改操作
mutate({ title: 'New Todo', completed: false });

defineMutation

defineMutation 用于在 Pinia Store 中定义修改操作。它返回一个可以在 Store 中使用的修改函数。

基本用法

javascript 复制代码
import { defineStore } from 'pinia';
import { defineMutation } from '@pinia/colada';

export const useTodoStore = defineStore('todo', () => {
  const addTodo = defineMutation({
    mutation: (newTodo) => fetch('/api/todos', {
      method: 'POST',
      body: JSON.stringify(newTodo),
    }).then((res) => res.json()),
  });

  return {
    addTodo,
  };
});

在组件中使用

javascript 复制代码
import { useTodoStore } from '@/stores/todoStore';

const todoStore = useTodoStore();
const { mutate, isLoading } = todoStore.addTodo;

// 触发修改操作
mutate({ title: 'New Todo', completed: false });

总结

pinia-colada 通过 useQuerydefineQueryuseMutationdefineMutation 提供了一套强大的工具,简化了 Vue应用中的异步状态管理和数据加载逻辑。无论是静态查询还是动态查询,都能轻松应对复杂场景。

往期精彩推荐

相关推荐
paopaokaka_luck9 分钟前
基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
前端·javascript·vue.js·spring boot·后端·小程序·uni-app
患得患失94942 分钟前
【前端】【vscode】【.vscode/settings.json】为单个项目配置自动格式化和开发环境
前端·vscode·json
飛_44 分钟前
解决VSCode无法加载Json架构问题
java·服务器·前端
YGY Webgis糕手之路3 小时前
OpenLayers 综合案例-轨迹回放
前端·经验分享·笔记·vue·web
90后的晨仔4 小时前
🚨XSS 攻击全解:什么是跨站脚本攻击?前端如何防御?
前端·vue.js
Ares-Wang4 小时前
JavaScript》》JS》 Var、Let、Const 大总结
开发语言·前端·javascript
90后的晨仔4 小时前
Vue 模板语法完全指南:从插值表达式到动态指令,彻底搞懂 Vue 模板语言
前端·vue.js
德育处主任4 小时前
p5.js 正方形square的基础用法
前端·数据可视化·canvas
烛阴4 小时前
Mix - Bilinear Interpolation
前端·webgl
90后的晨仔4 小时前
Vue 3 应用实例详解:从 createApp 到 mount,你真正掌握了吗?
前端·vue.js