10. pinia的基本使用

2023-09-25 22:07:51发布
64

pinia的基本使用

vue3中,官方推荐使用pinia代替vuex,你可以理解成pinia是vuex的升级版。pinia抛弃了vuex的mutations概念,只保留了state、getter、action

使用步骤

1、安装

npm i pinia -S

2、在main.js中注册

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

const app = createApp(App)
app.use(createPinia()) // 2.使用
app.mount('#app')

3、在src的根目录下创建一个store的文件夹,然后新建一个user.js文件。并写上以下代码 :

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

// 使用defineStore函数创建store,这里的userId必须是唯一的,不能重复。相当于vuex的namespace
export const useUserStore = defineStore('userId', () => {
    
    // 相当于vuex的state
    const info = ref({
        name: 'tom',
        age: 10
    })
    const flag = ref(false)
    
    // 相当于vuex的getter
    const getAge = computed(() => {
        return info.value.age
    })
    
    // 相当于vuex的action,同步和异步都这样写
    const setAge = (age) => {
        info.value.age = age;
    }

    return {
        info,
        getAge,
        setAge
    }
})

4、使用

<template>
  <div>
    <p>{{ userStore.flag }}</p>
    <p>{{ userStore.info.name }}</p>
    <p @click="userStore.setAge(20)">{{ userStore.getAge }}</p>
  </div>
</template>
<script setup>
import { useUserStore } from './store/user' // 1. 导入

const userStore = useUserStore(); // 2. 调用函数
</script>


storeToRefs

上面的例子,在模板上展示数据和调用方法多需要userStore.xxx比较麻烦。你可以使用storeToRefs结构出来

修改上面的例子

<template>
  <div>
    <p>{{ flag }}</p>
    <p>{{ info.name }}</p>
    <p @click="setAge(20)">{{ getAge }}</p>
  </div>
</template>
<script setup>
import { storeToRefs } from "pinia"
import { useUserStore } from './store/user'

const userStore = useUserStore()
const { flag, info, getAge } = storeToRefs(userStore) // 必须使用storeToRefs函数结构出来,不然会丢失响应式
const { setAge } = userStore; // 函数直接结构出来即可
</script>


持久化

推荐使用pinia-plugin-persistedstate这个插件做持久化。

1、插件安装

npm i pinia-plugin-persistedstate -S

2、在main.js中注册

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import persist from 'pinia-plugin-persistedstate' // 1.导入


const app = createApp(App)


const pinia = createPinia(); // 2. 创建


pinia.use(persist) // 3. use

app.use(pinia)

app.mount('#app')

3、在store文件夹中创建一个js文件,写入以下内容 :

import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('numberManager', () => {

    const number1 = ref(0);
    const number2 = ref({
        n: 0
    })

    const setNumber = (val) => {
        number1.value += val;
        number2.value.n += val * 2;
    }

    return {
        number1,
        number2,
        setNumber
    }
}, {
    persist: true // 在defineStore的第三个函数中设置persist为true,则代表缓存所有数据(数据指的是number1、number2)
})

4、使用

<template>
  <div>
    <p @click="tempStore.setNumber(1)">
      {{ tempStore.number1 }}
      <br/>
      {{ tempStore.number2.n }}
    </p>
  </div>
</template>
<script setup>
import { useUserStore } from './store/user'

const tempStore = useUserStore();
</script>

当执行点击后,打开浏览器的Application,可以看到,该插件默认是把我们的数据存储到localStorage

其它配置

import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('numberManager', () => {

    const number1 = ref(0);
    const number2 = ref({
        n: 0
    })

    const setNumber = (val) => {
        number1.value += val;
        number2.value.n += val * 2;
    }

    return {
        number1,
        number2,
        setNumber
    }
}, {
    persist: {
        key: 'mynumber', // 修改localStorage存储的key名
        paths: ['number1', 'number2.n'], // 要缓存的数据
        storage: sessionStorage // 存储数据的方式,只能是localStorage或者sessionStorage
    }
})