闲暇之余总结的Pinia,确定不来看一眼?

605 阅读3分钟

我们可以说pinia是vuex的升级版本,当然官方尤大团队亲力推荐。未来必将会逐步流行。所以未雨绸缪,现在学习一下这个还是很有必要的。最近看了很多的文章,官方文档也看了一遍。还是觉得好记性不如烂笔头,所以趁着工作的闲暇,亲自再梳理一遍。加强一下记忆。

首先丢一个官网:

pinia

Pinia 是一个用于 Vue 的状态管理库,类似 Vuex, 是 Vue 的另一种状态管理方案

Pinia 支持 Vue2 和 Vue3

与vuex的比较

Pinia 提供了一个更简单的 API,具有更少的规范,提供了 Composition-API 风格的 API,最重要的是,在与 TypeScript 一起使用时具有可靠的类型推断支持。

特点

1、没有mutations了。

2、无需自定义支持Ts类型,它的所有内容都是类型化的。

3、不需要导入,调用函数。

4、没有module的嵌套结构

5、没有命名空间模块

安装

我这里是采用vite去新建vue项目,也可以通过vue-cli去新建。不过建议可以用vite去新建,因为vite速度更快,你启动项目或者当你对代码做出更改的时候会更加快速的得到响应,这对于程序员来说是很舒服的。具体的优势这里不多讨论,可以查阅vite官网。

vite官网

  npm install pinia

在main.js中进行引入

import { createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')

在项目src目录下新建store文件夹,在store里面新建index.ts文件

import { defineStore } from 'pinia'
export const useStore = defineStore('main', {
    state: () => ({
        firstCounter: 12
      })
})
// 这里的main相当于是一个id,每一个store独一无二的id。useStore名字可以是随意的。

state

在我们的组件中引入

import { useStore } from "../store";

在我们的组件里面进行使用

import { defineComponent,ref } from "vue"
import { useStore } from "../store";
import { storeToRefs } from 'pinia'
  export default defineComponent({
      setup(){
        const count = ref(0);
        const store = useStore()
        const { firstCounter } = storeToRefs(store); // 这里不能直接解构,直接解构会使数据失去响应式,要用storeToRefs函数 
        return{
          count,
          firstCounter,
        }
      }
  })

这里有个需要注意的地方,如果我们直接使用const { firstCounter } = useStore()去获取值的话,会使数据失去响应式。这里建议用pinia提供的storeToRefs的api去获取响应式的store值。除开这个你还可以用computed去获取响应式的数据:

computed(() => store.doubleCount)

改变值

直接改变store实例

const store = useStore()
store.counter++

调用$reset(),使其恢复初始状态

const store = useStore()
store.$reset()

getters

getter跟vuex的用法差不多,都是state的计算属性的方式。

import { defineStore } from 'pinia'
export const useStore = defineStore('main', {
    state: () => ({
        firstCounter: 12
      }),
      getters: {
        doubleCount: (state) => state.firstCounter,
      },
})

actions

actions相当于组件中的methods,里面既可以进行同步操作,也可以进行异步操作。

import { defineStore } from 'pinia'
// 定义一个异步函数模拟接口请求
function asyncFunction(){
    return new Promise((res,rej)=>{
        setTimeout(() => {
            res(123)
        }, 3000);
    })
}
export const useStore = defineStore('main', {
    state: () => ({
        firstCounter: 12
      }),
      getters: {
        doubleCount: (state) => state.firstCounter,
      },
      actions: {
          // 同步方法
        increment() {
          this.firstCounter++
        },
        // 异步方法
        async asyncFun(){
            this.firstCounter =  await asyncFunction()
        }
      },
})

在组件中:
import { defineComponent, ref, onMounted } from "vue";
import { useStore } from "../store";
import { storeToRefs } from "pinia";
export default defineComponent({
  setup() {
    const count = ref(0);
    const store = useStore();
    const { firstCounter } = storeToRefs(store); // 这里不能直接解构,直接解构会使数据失去响应式,要用storeToRefs函数
    function showPinia() {
      console.log("异步更改");
      store.asyncFun();
    }
    onMounted(() => {});
    return {
      count,
      firstCounter,
      showPinia,
    };
  },
});

基本使用就到这里了,后续进行深层的研究。