使用pinia遇到的坑
最近在进行vue3的开发中,使用了pinia,在vue文件中引入就是响应式的,确实很好用,但是pinia也有一些缺点,这里分享一些我遇到的和pinia有关的坑以及解决办法。
1.mutation.events是undefined
我将翻页的pageNum和pageSize的值放在了store中,然后,我想监听指定的属性变化,调用后台接口,也就是pageNum和pageSize的值发生变化。
pinia可以通过 store 的 $subscribe() 方法查看状态及其变化,我一看这是pinia提供的,那就用他了,打印出回调的两个参数,发现mutation.events.key这个属性能监听到变化的值。
xxStore.$subscribe((mutation,state)=>{
console.log(mutation);
console.log(state);
})
那么我只需要
xxStore.$subscribe((mutation,state)=>{
if(mutation.events.key == "pageNum"||mutation.events.key == "pageSize"){
//接口调用
}
})
**但是,这个只在本地调试有用,在打包后,你会发现mutation.events的值是undefined。**所以,如果你想监听指定的state中的值的变化,你是不能使用$subscribe的,你应该使用计算属性:
const pageNum = computed(() => {
return xxStore.pageNum
})
const pageSize = computed(() => {
return xxStore.pageSize
})
watch(pageNum, (newValue, oldValue) => {
//接口调用
});
watch(pageSize, (newValue, oldValue) => {
//接口调用
});
如何在打包后获取mutation.events.key的值,目前我还没找到这个问题的答案,如果有谁知道,希望评论区告知一下,多谢。
2.非Vue文件中使用无法响应式。
我在进行全局axios封装时,想添加一个全局loading,这样,每次进行http请求时,就会自动触发loading。我之前Vue2的项目,这个事情都交给Vuex去做,这里,我就想当然的交给pinia去做了。
我在app.vue中给router-view套了个spin,把这个spin绑定了一个state,然后在axios封装的js文件中进行修改,但是,在js文件中进行修改,vue文件无法实时监听state的属性变化。我只能放弃这个实现路线。