vue3中Pinia

一、pinia的简单使用

vuex和pinia的区别

参考网址:[Vuex] Vuex 5 by kiaking · Pull Request #271 · vuejs/rfcs · GitHub

1.pinia没有mutations,只有:state、getters、actions

2.pinia分模块不需要models(之前vuex分模块需要models)

3.TS支持的很好

4.pinia体积更小(性能更好)

5.pinia可以直接修改state数据

 pinia的使用

1. npm i pinia

2. 在main.js中进行引用

        import { createPinia } from 'pinia';   

        export const app = createApp(App)

        app.use(createPinia());

3.在src下store文件下新建index.js

import { defineStore } from 'pinia'
const userStore = defineStore({id: 'useStore',//id必须唯一state: () => {return {token: '123',userInfo: null,}},getters:{},actions: {setToken(token) {this.token = token},},
})export default userStore

4.在组件中使用pinia

        a.不结构state,通过pinia的actions去更改state

<template><div class="A"><h1>A组件</h1> <div>{{ store.token }}</div><div>姓名:{{store.userInfo.name}} &nbsp;  年龄:{{ store.userInfo.age }}</div><el-button  type="success" @click="changeName()">修改名称</el-button></div>
</template><script setup>
import { userStore } from '../store/index.js';
const store = userStore()
let {setName} = storelet changeName =()=>{setName('李四')
}</script><style lang="scss">
.A{font-size: 30px;margin: 0 auto;text-align: center;.el-button{font-size: 30px;padding: 10px;height: 50px;}
}
</style>

             

        b.结构state时候要使用storeToRefs去让它变成响应式数据从而改变

<template><div class="A"><h1>A组件</h1> <div>{{ token }}</div><div>姓名:{{userInfo.name}} &nbsp;  年龄:{{ userInfo.age }}</div><el-button  type="success" @click="changeName()">修改名称</el-button></div>
</template><script setup>
import { storeToRefs } from 'pinia';
import { userStore } from '../store/index.js';
const store = userStore()
let {token,userInfo,setName} = storeToRefs(store)let changeName =()=>{// userInfo.value.name='李四'//$patch批量修改store.$patch(state=>{console.log(state);state.userInfo.age=12state.userInfo.name='李四'})
}</script><style lang="scss">
.A{font-size: 30px;margin: 0 auto;text-align: center;.el-button{font-size: 30px;padding: 10px;height: 50px;}
}
</style>

      

        c.pinia的getters

import { defineStore } from 'pinia'
export const userStore = defineStore({id: 'useStore',state: () => {return {token: 'gdsiuafoi1234_key',userInfo: {name:"张三",age:18},}},getters:{//箭头函数--接受参数getNameInfo:state=>{//箭头函数中this不是storereturn (param)=>`${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`},getNameInfo1(state){return function(param){return `2.${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`}}}
})
<template><div class="A"><h1>A组件</h1> <div>{{ token }}</div><div>姓名:{{userInfo.name}} &nbsp;  年龄:{{ userInfo.age }}</div><div>{{getNameInfo('是吗?')}}</div><div>{{getNameInfo1(',对的')}}</div><el-button  type="success" @click="changeName()">修改名称</el-button></div>
</template><script setup>import { storeToRefs } from 'pinia';
import { userStore } from '../store/index.js';
const store = userStore()
let {token,userInfo,setName,getNameInfo,getNameInfo1} = storeToRefs(store)</script><style lang="scss">
.A{font-size: 30px;margin: 0 auto;text-align: center;.el-button{font-size: 30px;padding: 10px;height: 50px;}
}
</style>

二、pinia的分模块化

在store文件下通过不同的js进行分模块拆分

user.js

import { defineStore } from 'pinia'
export const user = defineStore({id: 'user',state: () => {return {token: 'gdsiuafoi1234_key',userInfo: {name:"张三",age:18},}},getters:{//箭头函数--接受参数getNameInfo:state=>{//箭头函数中this不是storereturn (param)=>`${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`},getNameInfo1(state){return function(param){return `2.${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`}}},actions: {setToken(token) {this.token = token},setName(name){this.userInfo.name=name}},
})

 shop.js

import { defineStore } from 'pinia'
export const shop = defineStore({id: 'shop',state: () => ({shopList:['鞋子','衣服'] }),getters:{},actions: {},
})

使用:

<template><div class="A"><h1>A组件</h1> <div>{{userInfo.name}} &nbsp; {{userInfo.age}}</div><div>{{getNameInfo('是吗?')}}</div><el-button  type="success" @click="changeName()">修改名称</el-button><div>shopStore</div><div v-for="(el,index) in shopList" :key="index">{{el}}</div></div>
</template><script setup>import { storeToRefs } from 'pinia';
import { user } from '../store/user.js';
import {shop} from '../store/shop.js'
const userStore = user()
const shopStore = shop()
console.log(userStore);
let { userInfo,getNameInfo } = storeToRefs(userStore)
let { shopList } = storeToRefs(shopStore)const changeName = ()=>{// userInfo.value.name='李四'userStore.setName('李四')
}</script><style lang="scss">
.A{font-size: 30px;margin: 0 auto;text-align: center;.el-button{font-size: 30px;padding: 10px;height: 50px;}
}
</style>

          

 三、pinia的持久化存储

1.下载插件依赖:npm i pinia-plugin-persist -save

2.在store文件下新建index.js文件,再在main.js中引入并使用

        import store from './store/index.js';  app.use(store);

idnex.js

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

在模块化中使用(user)

persist:{//是否启用持久化存储,不进行配置默认存储为session,刷新页面持久化了但是重新开启一个页面还是开始的值enabled:true}

a.基础使用

创建 Store 时,将 persist 选项设置为 true,整个 Store 将使用默认持久化配置保存。

默认持久化配置

        使用 session进行存储

        store.$id作为 storage 默认的 key

        使用 JSON.stringify / JSON.parse进行序列化/反序列化

        整个 state 默认将被持久发

b.高级使用

        三个常用属性:   

                key:存储名称。

                storage:存储方式。 sessionStorage 、localStorage

                path:用于指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state。

import { defineStore } from 'pinia'
export const user = defineStore({id: 'user',state: () => {return {token: 'gdsiuafoi1234_key',userInfo: {name:"张三",age:18},}},getters:{//箭头函数--接受参数getNameInfo:state=>{//箭头函数中this不是storereturn (param)=>`${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`},getNameInfo1(state){return function(param){return `2.${state.userInfo.name}今年已经${state.userInfo.age}岁了${param}`}}},actions: {setToken(token) {this.token = token},setName(name){this.userInfo.name=name}},persist:{//是否启用持久化存储,不进行配置默认存储为session,刷新页面持久化了但是重新开启一个页面还是开始的值enabled:true,strategies:[{key:'user_info',storage:localStorage,paths:['userInfo']}]}
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:67.二进制求和

67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 又是一道求和题&#xff0c;% / 在求和的用途了解了些&#xff0c; 目录 题目&#xff1a; 思路分析&#xff1a; 博主代码: 官方代码&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路分析&#xf…

【电路笔记】-串联电感

串联电感 文章目录 串联电感1、概述2、电感串联示例13、互耦串联电感器4、电感串联示例25、电感串联示例36、总结当电感器以菊花链方式连接在一起并共享公共电流时,它们可以串联连接在一起。 1、概述 这些电感器的互连产生了更复杂的网络,其总电感是各个电感器的组合。 然而…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

软件23-上午题-树与二叉树2

一、平衡二叉树 平衡二叉树&#xff1a;是一棵空树或它的左右两个子树的高度差的绝对值不超过 1&#xff0c; 并且左右两个子树都是一棵平衡二叉树。 注意&#xff1a; 完全二叉树 平衡二叉树&#xff01;&#xff01;&#xff01; 二、二叉排序树&#xff08;二叉查找树、二…

算法-----高精度算法1(高精度加法,高精度减法)(详解)

什么是高精度算法&#xff1f; 高精度的意思就是他得名字----高的精度&#xff0c;简单说就是位数很大&#xff0c;而高精度算法就是将这些高精度数&#xff08;位数很大在几百几千几万位的数叫高精度数&#xff09;通过计算机的型式模拟出来结果。 为什么要用高精度算法&…

坚持刷题|环形链表

文章目录 题目考察点代码实现扩展问题 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;刷了一段时间二叉树啦&#xff0c;今天换链表刷&#xff1a;环形链表 题目 141. 环形链表 考察点 主要考察了链表的基本操作和快慢指…

PySQLRecon:一款功能强大的MSSQL安全测试工具

关于PySQLRecon PySQLRecon是一款功能强大的MSSQL安全测试工具&#xff0c;该工具基于SQLRecon实现其功能&#xff0c;可以帮助广大红队研究人员针对MSSQL执行攻击性安全测试。 环境配置 由于该工具基于Python 3开发&#xff0c;因此我们首先需要在本地设备上安装并配置好Pyt…

【51单片机】矩阵键盘(江科大)

6.1矩阵键盘 矩阵键盘&#xff1a; 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 1.数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→ …… ,然后快速循环这个过程,最终实现所…

软件架构与系统架构:区别与联系的分析

软件架构与系统架构&#xff1a;区别与联系的分析 在信息技术领域&#xff0c;软件架构和系统架构这两个术语经常被提及。尽管它们在某些方面有重叠&#xff0c;但它们确实代表了不同的概念和聚焦点。理解这两种架构之间的区别和联系对于任何从事技术开发和设计的专业人士都是至…

【复现】Supabase后端服务 SQL注入漏洞_48

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Supabase是什么 Supabase将自己定位为Firebase的开源替代品&#xff0c;提供了一套工具来帮助开发者构建web或移动应用程序。 Sup…

高效的工作学习方法

1.康奈尔笔记法 在这里插入图片描述 2. 5W2H法 3. 鱼骨图分析法 4.麦肯锡7步分析法 5.使用TODOLIST 6.使用计划模板&#xff08;年月周&#xff09; 7. 高效的学习方法 成年人的学习特点&#xff1a; 快速了解一个领域方法 沉浸式学习方法&#xff1a; 沉浸学习的判据&am…

TapableHookPlugins

以极客时间《玩转Webpack》课程学习为主的记录笔记。 源码解读 webpack的命令跟踪&#xff0c;从node_modules/webpack/bin/ 可以看到命令内容&#xff0c;webpack会查看是否下载安装了webpack-cli / webpack-command。使用webpack-cli 解析命令行信息、安装使用到的依赖&…