vue vite pinia 跳转页面时会显示pinia中的action not a function

vue跳转页面时第一子路由页面偶尔会显示Pinia中的action not a function,而跳转的另一个同级路由页面一定会报错 对应的pinia action is not a function 都是刷新后就有了,求解答

页面js:

import { useEnterStore } from '@/store/main/userenter/userEnter'
import { storeToRefs } from 'pinia'

import { ref } from 'vue'
import { formatUTC } from '@/utils/format'

import { localCache } from '@/utils/cache'

const userId = localCache.getCache('userId')

//const userStore = useUserStore()
const userEnterStore = useEnterStore()

//const userId = userStore.userId
const currentPage = ref(1)
const webpageSize = ref(6)

//查询
function fetchEnterListData(queryInfo: any = {}) {
  //获取offset和size
  const pageSize = webpageSize.value
  const pageIndex = currentPage.value

  const info = { pageIndex, pageSize }
  //带参数查询时将数组组合在一起
  const totalquery = { ...info, ...queryInfo }

  userEnterStore.postUserEnterListAction(totalquery)
}
fetchEnterListData({ userId: userId.id })
const { enterList, enterTotalCount } = storeToRefs(userEnterStore)


```路由
import { useEnterStore } from '@/store/main/userenter/userEnter'
import { storeToRefs } from 'pinia'

import { ref } from 'vue'
import { formatUTC } from '@/utils/format'

import { localCache } from '@/utils/cache'

const userId = localCache.getCache('userId')

//const userStore = useUserStore()
const userEnterStore = useEnterStore()

//const userId = userStore.userId
const currentPage = ref(1)
const webpageSize = ref(6)

//查询
function fetchEnterListData(queryInfo: any = {}) {
  //获取offset和size
  const pageSize = webpageSize.value
  const pageIndex = currentPage.value

  const info = { pageIndex, pageSize }
  //带参数查询时将数组组合在一起
  const totalquery = { ...info, ...queryInfo }

  userEnterStore.postUserEnterListAction(totalquery)
}
fetchEnterListData({ userId: userId.id })
const { enterList, enterTotalCount } = storeToRefs(userEnterStore)
```javascript



```报错

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/549034916886196.png "#left")

pinia store的内容


import { userEnterListData } from '@/service/main/userEnter/userEnter'
import { defineStore } from 'pinia'
import { ElMessage } from 'element-plus'

interface ISystenState {
  enterList: any[]
  enterTotalCount: number
  userId: number | string
}
export const useEnterStore = defineStore('system', {
  state: (): ISystenState => ({
    enterList: [],
    enterTotalCount: 0,
    userId: 0
  }),
  actions: {
    async postUserEnterListAction(queryInfo: any) {
      const userListResult = await userEnterListData(queryInfo)
      if (userListResult.code !== 200) {
        ElMessage.error(userListResult.message)
      } else {
        const totalCount = userListResult.data.total
        const enterlist = userListResult.data.records
        this.enterList = enterlist
        this.enterTotalCount = totalCount
      }
    }
  }
})

参考 https://pinia.vuejs.org/core-concepts/actions.html

确保在路由跳转完成后,再执行Pinia的初始化或调用相关action。可以通过监听路由跳转事件,如vue-router的beforeEach钩子函数,来判断当前页面是否已经渲染完成,然后再执行Pinia的相关操作。
在路由跳转时,使用replace方法替换当前路由,并设置一个标志位,表示当前页面是否需要执行Pinia的初始化或调用相关action。

Vue3在router中使用pinia报错的问题解决办法
可以参考下
https://blog.csdn.net/hangsky1990/article/details/128805579

如果问题只在刷新后才出现,可能是因为在刷新时丢失了Pinia store的状态
你可以尝试使用插件如pinia-persist来实现Pinia状态持久化,以确保在刷新后能够正确恢复状态

当在Vue Vite项目中跳转页面时出现"Pinia中的action不是一个函数"的错误,可能是由于以下几个原因导致:

Pinia插件未正确配置:请确保你已经正确地安装和配置了Pinia插件。在Vue Vite项目中,你需要安装@pinia/vite-plugin插件,并在vite.config.js文件中进行配置。确保已经正确地导入和使用Pinia插件。

异步操作错误:如果在Pinia的Action中进行了异步操作,例如发送网络请求或使用setTimeout等函数,需要确保异步操作正确处理。Pinia的Action应该返回一个Promise对象或使用async/await来处理异步操作。

使用错误的函数调用方式:请检查你是否正确地调用了Pinia中的Action函数。确保在调用Action函数时没有遗漏括号,例如store.actionName()。

Pinia Store未正确实例化:如果Pinia Store没有正确地实例化或初始化,可能会导致Action函数无法被调用。确保在组件中正确地实例化了Pinia Store,并通过useStore函数进行引用。

基于new bing部分指引作答:
根据您提供的代码和错误信息,问题可能出现在以下几个方面:

1、路由切换时组件未销毁:在切换路由时,如果组件未正确销毁,可能会导致之前的状态和数据仍然存在。这可能会导致使用 Pinia 的 action 时出现问题。确保在路由切换时组件被正确销毁,以避免状态冲突。

2、Pinia store 的初始化问题:确认 Pinia store 是否已经正确初始化并在应用的根组件中注册。如果 store 没有被正确注册,将无法正常调用其中的 action。确保在应用的入口文件中正确初始化并注册 Pinia。

3、异步加载问题:如果在路由切换时,页面组件是异步加载的,而且在加载完成前就调用了 Pinia store 的 action,可能会导致该错误。确保在异步加载完成后再调用 Pinia 的 action。

4、Pinia 的版本兼容性问题:检查您所使用的 Vue、Pinia、Vite 和相关依赖的版本兼容性。不同版本之间可能存在一些不兼容的问题,导致报错。确保您所使用的版本是兼容的,并且没有已知的问题。

请注意,以上仅是一些可能导致问题的常见情况,实际原因可能需要进一步排查。建议您检查上述方面,并结合具体情况进行调试和排查。

根据您提供的代码和报错信息,可以初步判断问题可能出现在以下几个方面:

  1. 引入的Pinia库使用不正确:请确保已正确安装和引入Pinia库,并且在Vue应用的入口文件中正确初始化Pinia。

  2. Pinia store中的action未正确定义:请确认userEnterStore中的postUserEnterListAction是否正确定义为一个action函数。您可以检查useEnterStore中的userEnterStore.ts文件,确保postUserEnterListAction被正确定义。

  3. 异步操作导致调用时机不正确:由于您的代码中涉及异步操作(例如从缓存中获取userId),可能会导致在调用postUserEnterListAction时还未获取到正确的userId。建议您使用await或使用Promise来确保在调用fetchEnterListData之前已经获取到了正确的userId。

  4. 路由跳转导致状态丢失:在路由跳转时,可能会导致当前页面的状态丢失,包括Pinia store中的状态。所以当您跳转到另一个同级路由页面时,可能会导致无法调用postUserEnterListAction。您可以尝试在路由跳转前,将相关数据存储在持久化的地方(如localStorage),在跳转后再重新获取并恢复状态。

以下答案参考newbing,回答由博主波罗歌编写:
根据你提供的信息,可能导致报错的原因有以下几点:

  1. userEnterStore.postUserEnterListAction 不是一个函数:请确保在 useEnterStore 中定义了 postUserEnterListAction 方法,并且它是一个函数。可以在 useEnterStore 中确认一下。

  2. fetchEnterListData({ userId: userId.id }) 被调用的时机不对:如果报错是在跳转页面时发生的,那么是不是应该在页面渲染之前调用 fetchEnterListData 方法呢?你可以尝试在页面组件的 mounted 或者 beforeRouteEnter 生命周期钩子中调用该方法。

  3. 路由配置存在问题:请确保你的路由配置正确,useEnterStore 被正确地注入到了路由组件中。同时,确保你在路由组件中使用了正确的组件导入语句。

另外,你提供的路由配置代码似乎是重复的,我不确定你是否将正确的代码部分复制到了问题描述中。如果上述的解决方案没有解决问题,请提供更多的信息,比如路由配置代码和 useEnterStore 的实现代码,这样我才能更好地帮助你解决问题。
如果我的回答解决了您的问题,请采纳!

  1. 引入 Pinia 时的错误:请确保已正确安装和配置了 Pinia。确保已在 Vue 项目中正确引入 Pinia,并正确创建了 Pinia 实例。

  2. action 名称错误:请检查在调用 action 时使用的名称是否正确。确保使用的是正确的 action 名称,并且该名称与定义的 action 名称完全匹配,包括大小写。