Pinia 中推荐通过 actions 修改状态,action 内直接用 this.xxx 赋值或调用数组/对象方法同步更新 state,无需 return 或手动触发更新;所有变更逻辑应收口到 actions 以保障可维护性、可测试性和扩展性。

Pinia 中通过 actions 修改状态是最推荐、最规范的方式。它不是“间接”操作,而是直接在 action 函数体内对 this.xxx 赋值或调用数组/对象方法,从而同步更新 state。
action 内部可以直接访问并修改 state
在 defineStore 的 actions 配置中,每个函数的 this 指向当前 store 实例,所有 state 字段都可通过 this.字段名 读写:
- 赋值修改:如
this.count = 10、this.name = '张三' - 数组操作:如
this.list.push(item)、this.list.splice(index, 1) - 对象属性增删改:如
this.user.age = 25、this.config.theme = 'dark' - 注意:无需 return,也不需要额外触发更新机制,响应式系统自动追踪
常见修改场景与写法示例
比如一个管理用户列表的 store:
export const useUserStore = defineStore('user', {
state: () => ({
list: [],
loading: false,
total: 0
}),
actions: {
// 添加用户(直接 push)
addUser(user) {
this.list.push({ ...user, id: Date.now() })
this.total++
},
// 更新某条用户(直接赋值)
updateUser(id, updates) {
const target = this.list.find(u => u.id === id)
if (target) Object.assign(target, updates)
},
// 清空列表(直接重置)
clearList() {
this.list = []
this.total = 0
}
}
})
组件中调用 action 就等于触发状态变更
在组件里解构或调用 action,执行后 state 立即响应:
- 使用 setup 语法:
const userStore = useUserStore(); userStore.addUser({ name: '李四' }) - 不需
store.$patch或手动store.$state = {...} - 也不建议在组件中直接写
userStore.list.push(...)—— 这会绕过逻辑封装,破坏可维护性
为什么不用直接改 state?
虽然技术上允许(如 store.list.push(...)),但官方明确建议把所有变更逻辑收口到 actions 中:
- 便于统一加日志、错误处理、权限校验
- 支持异步操作(比如先请求接口再更新 state)
- 方便复用和单元测试 —— action 是纯函数,输入参数,内部操作 this
- 避免多处散落修改逻辑,降低状态失控风险


















