vue3使用pinia,并且持久化存储

本文介绍了如何在Vue3项目中使用Pinia进行状态管理,并结合npm安装的pinia-plugin-persist插件实现数据的持久化存储。步骤包括安装Pinia和持久化插件,创建store目录及文件,引用Pinia到main.ts,以及在组件中使用Pinia。

1.下载pinia

npm install pinia

2.下载持久化存储插件

npm i pinia-plugin-persist --save

2.在src下创建一个store文件夹,在store文件夹下创建index.ts

import {createPinia} from 'pinia'
// 引入pinia的持久化存储插件
import piniaPluginPersist from 'pinia-plugin-persist';
const pinia = createPinia()
//使用持久化插件
pinia.use(piniaPluginPersist)
export default pinia





3.在store文件夹下新建一个test.ts文件,里面就是你要是用的了

//引入pinia
import {defineStore } from 'pinia'

import axios from 'axios'
// 这个main是随便定义的标识
export const useMainStore = defineStore('main',{
    state:()=>{
        return{
            count:10,
            list:[
                {name:'张三',age:18},
                {name:'李四',age:28},
            ],
           actionList:[],
        }
    },
    getters:{
        // 计算年龄
        sum:(state)=>{
            return state.list.reduce((pre,item)=>{
                return pre+item.age
            },0)
        }
    },
    // 同步和异步皆可
    actions:{
        async getTimu(){
           let res=await axios.get('https://www.cpengx.cn/static/timu/timu.json');
           console.log(res)
        //    将接口返回的数据赋值给state
           this.actionList = res.data;
        }
       
    },
// 开启数据缓存--下面这种只是存在会话存储中sessionStorage
    persist:{
        enabled:true
    },
    // 开启数据缓存--下面这种只是存在本地存储中localStorage
    persist:{
        enabled:true,
        strategies:[
            {
                key:'my_user',
                storage:localStorage
            }
        ]
    },
})









4.在main.ts中引用pinia

import store from './store'
qpp.use(store)

5.在页面上使用pinia

<template>
    <div>
        商品数量:{{store.count}}
    </div>
    <button @click="add">state点击加加</button>
    <button @click="patchClick">patch点击加5</button>
    <button @click="patchClicks">替换state</button>
    <button @click="resetState">重置状态</button>
    <button @click="store.getTimu()">获取store里面的异步数据</button>

    <div v-for="(item,index) in store.list" :key="index">
        <h5>{{item.name}}---{{item.age}}</h5>
    </div>
    <h1>年龄:{{store.sum}}</h1>
</template>

<script lang="ts" setup>
//引入
import {useMainStore} from '../../store/test';
// store能拿到相关定义模块
const store =useMainStore();
// 对state修改
const add=()=>{
    store.count++;
    store.list.push({
        name:'王五',
        age:36
    }) 
}
// $patch修改--写法1
const patchClicka=()=>{
    store.list.push({
        name:'钱六',
        age:43
    }) 
    store.$patch({
        count:store.count+5,
        list:store.list,
    })
}
// $patch修改--写法2
const patchClick=()=>{
store.$patch((state)=>{
    state.list.push({
        name:'钱六',
        age:16
    })
    state.count+6
})
}
// 将整个store的state替换
const patchClicks=()=>{
store.$state={
    count:100,
    list:[{name:'小明',age:2}],
    actionList:[]
}
}
// 重置state
const resetState=()=>{
    store.$reset();
}

// 监听状态(仓库)
store.$subscribe((mutation,state)=>{
    console.log(mutation,'------',state)
})




</script>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值