Pina是可以可以用来帮助我们管理全局变量的信息,并进行相关的修改的组件,我们需要了解到的就是pinia从安装到使用的一系列流程。

首先需要做的是进行安装

npm install pinia

然后进行相关的创建和使用

import {createPinia} from ‘pinia’

const pinia = createPinia()

app.use(pinia)

在这之后,就相当于整个项目声明使用pinia了

如果希望使用pinia的话,需要在components同级文件夹之中创建store文件夹

然后在其中声明需要暴露的变量。

比如我们有一个全局变量sum

那么我们可以定义在比如一个count.ts中定义这个变量并进行暴露。

首先在上方进行引入定义state的相关函数,并在下方使用这个函数进行数值的定义

import {defineStore} from ‘pinia’

export const useCountStore = defineStore(‘count’,{

// 真正存储数据的地方

state(){

return {

sum:6

}

}

})

在之后就是对这个变量的使用

假如我们需要在Count.vue中进行使用。

首先是引入这个变量

import {useCountStore} from ‘@/store/count’

然后就可以利用这个函数获取到对应的全局变量

使用这个函数之后,就可以拿到变量中的值

useCountStore()

获取值的方式可以为

const countStore = useCountStore()

countStore.sum

或者 countStore.$state.sum

对于Pinia中数据的修改,也是符合直觉的,其提供了多种修改方式

最为简单的就是利用Store下的key进行修改

countStore.sum = 666

或者利用其提供的函数进行修改

countStore.$patch({

sum:999,

school:’atguigu’

})

或者一种在store声明的时候,往其中注册相关的action,之后就可以通过这些action进行相关的操作

actions:{

increment(value){

console.log(‘increment被调用了’,value)

if( this.sum < 10){

// 修改数据(this是当前的store)

this.sum += value

}

}

}

那么我们就可以进行相关的使用

counSotre.increment(n.value)

在action函数之中,pinia提供了this作为关键字从而方便我们去访问当前作用域的变量。

因此我们在actions中可以this.sum 进行访问,也可以this.$state.sum进行访问。

除此之外,还可以还可以利用toRefs,将相关的store的相关组件进行批量响应式处理

不过toRefs过于暴力,会将其下所有的结果都进行响应式处理

Pinia还提供了storeToRefs进行响应式处理,不过其中只会将数据进行转换

<script setup lang=”ts” name=”Count”>

import { useCountStore } from ‘@/store/count’

/* 引入storeToRefs */

import { storeToRefs } from ‘pinia’

/* 得到countStore */

const countStore = useCountStore()

/* 使用storeToRefs转换countStore,随后解构 */

const {sum} = storeToRefs(countStore)

</script>

之后在store之中,还可以定义相关的getters函数

比如我们定义了state

state(){

return {

sum:1,

school:’atguigu’

}

},

// 计算

getters:{

bigSum:(state):number => state.sum *10,

upperSchool():string{

return this. school.toUpperCase()

}

}

这样我们就可以在store之中进行使用

store.bigSum,这样触发的就是对应的函数

在pinia之中,还提供了针对store之中的数值进行订阅的能力,当store发生了变化,能够第一时间收到变化。

const talkStore = useTalkStore()

之后我们对这个store进行订阅 $subscribe,

talkStore.$subscribe((mutate,state)=>{

console.log(‘talkStore里面保存的数据发生了变化’,mutate,state)

localStorage.setItem(‘talkList’,JSON.stringify(state.talkList))

})

这样我们可以在state之中获取到数据的变化,比如state.talkList

最后我们说下store的组合式写法

在store的定义之中,我们除了使用defineStore进行store的定义之外。

还可以直接传入参数进行暴露

export const useTalkStore = defineStore(‘talk’,()=>{

// talkList就是state

const talkList = reactive(

JSON.parse(localStorage.getItem(‘talkList’) as string) || []

)

// getATalk函数相当于action

async function getATalk(){

// 发请求,下面这行的写法是:连续解构赋值+重命名

let {data:{content:title}} = await axios.get(‘https://api.uomg.com/api/rand.qinghua?format=json’)

// 把请求回来的字符串,包装成一个对象

let obj = {id:nanoid(),title}

// 放到数组中

talkList.unshift(obj)

}

return {talkList,getATalk}

})

上面我们利用函数加上json.parse

从localStorage之中取到了talkList,当取不到的时候,赋予一个空数组。

在action之中,则不需要使用this关键字,直接访问即可。

发表评论

邮箱地址不会被公开。 必填项已用*标注