Pinia Action 天然支持动态参数,定义时声明参数并调用时传入值即可;支持任意类型、解构、默认值;组件中按需传参;TypeScript 下建议标注类型;异步 action 应妥善处理返回 Promise。

Pinia Action 本身支持动态参数,关键在于定义时正确声明参数,并在调用时传入具体值。不需要额外“开启”动态能力,它天然就是函数,和普通 JavaScript 函数一样灵活。
直接在 action 定义中接收参数
在 store 的 actions 选项中,把 action 写成带参数的函数即可。参数可以是任意类型(字符串、对象、数组等),也可设默认值或使用解构。
- 基础写法:addTodo(title) { this.todos.push({ id: Date.now(), title }) }
- 解构对象参数:updateUser({ id, name, email }) { const user = this.users.find(u => u.id === id); if (user) Object.assign(user, { name, email }) }
- 可选参数 + 默认值:fetchPosts(page = 1, limit = 10) { return api.get('/posts', { params: { page, limit } }) }
在组件中调用时传入运行时值
action 调用完全由你控制——只要在触发时机(如按钮点击、表单提交)把当前变量或事件数据作为实参传进去即可。
- 绑定 input 输入:@input="store.setTitle($event.target.value)"
- 响应按钮点击:@click="store.deleteTodo(todo.id)"
- 异步操作中传参:async handleSave() { await store.saveDraft(this.form); this.isSaving = false; }
配合 TypeScript 更安全地管理参数
如果项目启用 TypeScript,建议为 action 显式标注参数类型,避免传错或漏传。
- 示例:actions: { login(credentials: { username: string; password: string }): Promise
{ /* ... */ } } - IDE 会自动提示参数名和类型,调用时传参错误会立即报红
- 复杂参数可用接口或 type 别名统一管理,提升复用性和可读性
注意异步 action 的返回值处理
如果 action 返回 Promise(比如发起 API 请求),调用方可以用 await 或 .then() 获取结果,实现更精确的流程控制。
- const result = await store.fetchUser(123) —— 等待完成再执行后续逻辑
- store.createPost(newPost).then(id => console.log('created:', id))
- 不 await 也不 catch 可能导致错误静默,建议至少包裹 try/catch

















