Pinia 基础教程

451 阅读1分钟

安装和配置 还有基本使用教程

yarn add pinia
# 或者使用 npm
npm install pinia

store 是一个用reactive 包裹的对象,不能对其进行直接解构

main.ts

//引入并创建pinia
import {createPinia} from 'pinia'
const pinia = createPinia()

createApp(App)
//注册pinia
.use(pinia)
.mount('#app')

getters 和 actions

创建数据

/store/index.ts

import { defineStore } from "pinia";
export default defineStore('main',{
    state:() =>{
        return{
            title:'我是pania的标题'
        }
    },
    //类似于vue2的computed,有缓存的计算属性
    getters:{
        getTitle(state){
            console.log('getters中的update调用了');
            return state.title ='getters'
            this.title === state.title //true它们是同一个东西
        }
        //或者,这主要是因为ts不能正确推到返回值的类型
        getTitle():string{
            console.log('getters中的update调用了');
            return this.title ='getters'
        }
    },
    //类似于vue2的methods
    actions:{
        setTitle(){
            this.title = 'action'
        }
    }
})

在需要使用Pinia数据的地方

<script name="demo-1" setup lang="ts">

//导入Pinia数据模块
import {useMainStore} from '../store/index'

//storeToRefs可以让Pinia使用起来更方便
import {storeToRefs} from 'pinia'

//mainStore不要简化这一步!,mainStore上面还有很多有用的方法
const mainStore = useMainStore()

//这个title就是Pinia里面的title了,是ref对象,在非代码模板区域需要.value
const {title} = storeToRefs(mainStore)

//如果要批量修改多个pinia对象写法
mainStore.$patch({
    //这里不用.value
    title:mainStore.title+='1'
})
//或者函数写法
mainStore.$patch(state=>{
    state.title +='2'//title应该等于 => "我是pania的标题2" 了
})
//调用actions中的函数
mainStore.setTitle()
//调用getters中的函数
mainStore.getTitle
mainStore.getTitle//因为有缓存,所以只会执行一次console.log('getters中的update调用了');
//Pinia还有其它很多有用的API,比如重置Pinia,如果你后续有更好的管理Pinia方法别忘了告诉我
</script>

<template>
<div>{{title}}</div>
<button @click="title+='!'">点我修改title</button>
</template>