vue3 ts 中使用 pinia 的问题

Uncaught Error: [🍍]: getActivePinia was called with no active Pinia. Did you forget to install pinia

在vue根组件外使用pinia的store会有这个错误,按官方教程的使用方法如下

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

如果是这样pinia是在main方法中初始化的并且只在vue根实例上引用到了。只需要将pinia的实例放在单独的文件中导入,在需要的的地方导入即可。

1.创建一个ts文件,存放单独的实例

//piniaInstance.ts
import { createPinia } from "pinia";
//所有需要使用到pinia的地方都引用这一个实例,如果在main中初始化则在vue根组件外无法使用。
const pinia = createPinia()
export default pinia

2.main.ts

//main.ts
import { createApp } from 'vue' 
import pinia from './stores/piniaInstance'
import App from '@/App.vue'
import router from '@/router' 
   
//在这里use同一个实例
app.use(pinia)
app.use(router)  
app.mount('#app')

 

3报错的页面使用pinia,在usexxxStore()传入pinia实例

//xx.ts 
import { usexxxStore } from "@/stores/runingFunStore";
import pinia from '@/stores/piniaInstance';
import {ref} from "vue"; 

//这里需要传递同一个pinia实例
const xxxStore = usexxxStore(pinia)

还有一个问题是在定义store的actions中使用this的时候ts提示未定义或找不到,例如:

export const useStore = defineStore('main', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      //此处没有问题
      this.count++
    },
    randomizeCounter:()=> {
       //此处使用箭头函数this无效
      this.count = Math.round(100 * Math.random())
    },
  },
})

另外ts中定义store还需要使用泛型defineStore方法,否则在使用usexxxStore的时候所有类型都是never,而定义泛型的类型特别费事,所以在ts中正确的使用pinia是采用组合式Api,即可以避免箭头函数的this错误,也能够自动推断出data的数据类型。

例如:

//第二个参数使用箭头函数,而不是{}
export const useCounterStore = defineStore('counter', () => { 

 //相当于data
  const count = ref(0)
 
//相当于action
  function increment() {
    //不需要this,直接调用    
    count.value++ 
  }

//最后返回需要导出的内容
  return { count, increment }
})

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值