Vue3还在使用vuex? 不妨试试Pinia

268 阅读2分钟

1.pinia是什么

pinia是vuex的升级版,来实现状态管理。在Vue2中使用vuex实现状态管理,那么Vue3中使用pinia实现状态管理

2.pinia的优点

1.pinia中只有state、getter、action,抛弃了mutation

2.pinia中action支持同步和异步

3.良好的Typescript支持

4.体积非常小,只有1KB左右。

5..……

3.使用

3.1.安装

npm install pinia
​
如报错就加上--legacy-peer-deps
npm install pinia --legacy-peer-deps

3.2.引用

// main.ts
import { createPinia } from "pinia";
const pinia = createPinia();
createApp(App).use(pinia).mount("#app");

3.3.创建store

和vuex一样,创建store文件夹,在创建子文件,user.ts

调用pinia中的defineStore函数即可,该函数接收两个参数:

  • name:一个字符串,必传项,该store的唯一id。
  • options:一个对象,store的配置项,比如配置store内的数据,修改数据的方法等等。
// store/user.tsimport { defineStore } from 'pinia'// 第一个参数是应用程序中 store 的唯一 id,用于区分不用的这样就不同分层了
export const useUsersStore = defineStore('users', {
  // 其它配置项
})

4.state

4.1 使用store

// src/App.vue
<script setup lang="ts">
    import { useUsersStore } from "@/src/store/user";
    const store = useUsersStore();
    console.log(store);
</script>

4.2 添加state

state用来存储一下基本数据

export const useUsersStore = defineStore('users', {
  state: () => {
    return{
      name: "foo",
      age:18
      }
  }
})

state接收的是一个箭头函数返回的值,它不能直接接收一个对象。

4.3 使用state

import { useUsersStore } from "@/store/user";
const store = useUsersStore();
console.log(store.name);
console.log(store.age);
//当然也可以解构使用

4.4 修改state

<template>
  <div id="app">
    {{ store.name }}
    <button @click="changeName">改变name</button>
  </div>
</template>
<script lang="ts" setup>
import { useUsersStore } from "@/store/user";
const store = useUsersStore();
​
const changeName = () => {
  store.name = "bar";
};
</script>

注意:不使用解构的写法,name是响应式,若我们想使用解构的写法,又想是响应式的,则需要使用storeToRefs函数

<template>
  <div id="app">
    {{ name }}
    <button @click="changeName">改变name</button>
  </div>
</template>
<script lang="ts" setup>
import { storeToRefs } from "pinia";
import { useUsersStore } from "@/store/user";
const store = useUsersStore();
//使用storeToRefs来解构
const { name } = storeToRefs(store);
const changeName = () => {
  store.name = "bar";
};
</script>

4.5 修改多个stare变量

使用store.$patch()

const changeName = () => {
  store.$patch({
    name: "bar",
    age: 20,
  });
};

4.6 重置state

将starte重置为初始状态

store.$reset()

5.getter

getter和Vue2中的计算属性类似,对state中的数据进行计算并返回一个新结果

5.1 添加getter

import { defineStore } from "pinia";
export const useUsersStore = defineStore('users', {
  state: () => {
    return{
      name: "foo",
      age: 18,
      }
  },
  getters: {
    addAge:(state)=>{
      return state.age+10
    }
  }
})

5.2使用getters

直接在模板中调用即可

<template>
  <div id="app">
    {{ store.addAge }}
  </div>
</template>

5.3 getter中调用其它getter

通过this可以调用其他getter,但是调用的函数不能使用箭头函数!

export const useUsersStore = defineStore('users', {
  state: () => {
    return{
      name: "foo",
      age: 18,
      }
  },
  getters: {
    addAge:(state)=>{
      return state.age+10
    },
    addAges(){
      return 100+this.addAge
    }
  }
})

6.actions

actions和Vue2中的methods类似,可以存放业务逻辑

6.1 添加actions

import { defineStore } from "pinia";
export const useUsersStore = defineStore('users', {
  state: () => {
    return{
      name: "foo",
      }
  },
,
  actions: {
    changeName(value) {
      this.name=value
    }
  }
})

6.2使用actions

const handle = () => {
  store.changeName("bar ");
};