如何在Pinia的store.$subscribe中区分调用的action?
在Pinia中区分不同Action调用的方法
如果你需要像Vuex里检查mutation.type那样区分Pinia中setUserInfo和setUserFeatures的调用,有两种实用方案:
方案1:使用$onAction直接监听Action执行
Pinia提供了$onAction方法,可以直接监听store中所有action的调用,能直接获取到触发的action名称,是最准确的方式:
import { useUserStore } from '@/stores/user' // 替换成你的store实际路径 const userStore = useUserStore() // 监听所有action调用 userStore.$onAction(({ name, args, after, onError }) => { // name就是当前触发的action名称,对应你的setUserInfo或setUserFeatures switch(name) { case 'setUserInfo': console.log('触发了setUserInfo,参数:', args[0]) // 可在此处添加日志记录或业务逻辑 break case 'setUserFeatures': console.log('触发了setUserFeatures,参数:', args[0]) break } // 可选:监听action执行完成后的回调 after(() => { console.log(`action ${name}执行完成`) }) // 可选:监听action执行出错的回调 onError((err) => { console.error(`action ${name}执行出错:`, err) }) })
方案2:在$subscribe中通过变更路径判断
如果是通过$subscribe监听状态变更,可以通过状态变更的路径反向推断触发的action(前提是每个action只修改对应固定的状态):
import { useUserStore } from '@/stores/user' const userStore = useUserStore() userStore.$subscribe((mutation, state) => { // 获取所有变更的状态路径 const modifiedPaths = mutation.events.map(event => event.path) if (modifiedPaths.includes('userInfo')) { console.log('状态变更来自setUserInfo') } else if (modifiedPaths.includes('userFeatures')) { console.log('状态变更来自setUserFeatures') } })
注意:如果一个action同时修改多个状态,这种方法无法精准区分,此时优先使用方案1。
内容的提问来源于stack exchange,提问作者Swat25
相关产品推荐
相关产品推荐

