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://xiahunao.cn/news/2780613.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第7讲 全局异常统一处理实现

新建GlobalExceptionHandler类。 package com.java1234.exception;import com.java1234.entity.R; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdv…

【ES】--ES集成热更新自定义词库(字典)

目录 一、问题描述二、具体实施1、Tomcat实现远程扩展字典2、验证生效3、ES配置远程扩展字典4、为何不重启ES能实现热更新 一、问题描述 问题现象: 前面完成了自定义分词器词库集成到ES中。在实际项目中词库是时刻在变更的&#xff0c;但又不希望重启ES&#xff0c;对此我们应…

CSS盒子的概念

盒子模型 盒子的概念 页面中的每一个标签都可以看做是一个“盒子”&#xff0c;通过盒子的视角更方便的进行布局 浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会将网页中的元素看做是一个个的矩形区域&#xff0c;称之为“盒子” 盒子模型 CSS中规定每个盒…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…

五(一)java高级-集合-集合与迭代器(二)

5.1.2 Iterator迭代器 1、Iterator 所谓迭代器&#xff1a;就是用于挨个访问集合元素的工具/对象 方法&#xff1a; boolean hasNext():判断当前遍历集合后面是否还有元素可以迭代Object next():取出当前元素&#xff0c;并往后移→noSuchelementExceptionvoid remove():删…

S32 Design Studio的PE工具

S32 Design Studio软件是NXP公司专门为了方便用户开发S32K1系列芯片的IDE&#xff0c;跟Eclipse比较像。里面有个配套的图形工具Processor Expert&#xff0c;会产生一个后缀名为pe的文件&#xff0c;跟ST的cubemx作用类似。 双击pe文件即可打开pe界面&#xff0c;生成的文件将…

深入学习《大学计算机》系列之第1章 1.7节——图灵机的一个例子

一.欢迎来到我的酒馆 第1章 1.7节&#xff0c;图灵机的一个例子。 目录 一.欢迎来到我的酒馆二.图灵机2.1 艾伦-图灵简介2.2 图灵机简介 三.图灵机工作原理3.1 使用图灵机打印二进制数3.2 图灵机工作原理总结 四.总结 二.图灵机 本节内容主要介绍计算机科学之父——艾伦-图灵、…

基于SpringBoot、Docker和阿里云的稀土掘金社区自动签到与自动抽奖脚本:设计、开发与部署实践

创建一个SpringBoot项目 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.s…

【机器学习】支持向量机(SVM)

支持向量机&#xff08;SVM&#xff09; 1 背景信息 分类算法回顾 决策树 样本的属性非数值 目标函数是离散的 贝叶斯学习 样本的属性可以是数值或非数值目标函数是连续的&#xff08;概率&#xff09; K-近邻 样本是空间&#xff08;例如欧氏空间&#xff09;中的点目标函…

Vue 进阶系列丨实现简易VueRouter

‍‍Vue 进阶系列教程将在本号持续发布&#xff0c;一起查漏补缺学个痛快&#xff01;若您有遇到其它相关问题&#xff0c;非常欢迎在评论中留言讨论&#xff0c;达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧&#xff01; 2013年7月28日&#xff0c;尤雨溪第一次在 G…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

正则表达式与正则可视化工具:解密文本处理的利器

正则表达式与正则可视化工具&#xff1a;解密文本处理的利器 引言 在计算机科学和软件开发领域&#xff0c;正则表达式是一种强大而灵活的文本处理工具。然而&#xff0c;对于初学者来说&#xff0c;正则表达式的语法和规则可能会显得晦涩难懂。为了帮助初学者更好地理解和学…

Ps:直接从图层生成文件(图像资源)

通过Ps菜单&#xff1a;文件/导出/将图层导出到文件 Layers to Files命令&#xff0c;我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能&#xff0c;可以基于文档中的图层或图层组的名称&#xff0c;自动生成指定大…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

Qt Qt Creator安装与工程介绍

一.Qt概述 什么是Qt&#xff1a;Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 二.Qt Creator下载安装 下载地址&#xff1a;Index of /a…

openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存

文章目录 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存217.1 查看内存状况217.2 性能参数分析 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&…

探索Nginx:强大的开源Web服务器与反向代理

一、引言 随着互联网的飞速发展&#xff0c;Web服务器在现代技术架构中扮演着至关重要的角色。Nginx&#xff08;发音为“engine x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器&#xff0c;是一架由遥控站管理&#xff08;包括远程操纵或自主飞行&#xff09;的航空器&#xff0c;也称遥控驾驶航空器&#xff0c;以下简称无人机。 无人机系统的定义 无人机系统&#xff0c;也称无人驾驶航空器系统&#xff0c;是指一架无人…

[office] Excel表格中自动添加的超连接怎么取消? #媒体#其他#知识分享

Excel表格中自动添加的超连接怎么取消&#xff1f; Excel表格中自动添加的连接怎么取消&#xff1f;有时候在Excel2013中输入网址或邮箱时会自动添加超连接&#xff0c;本质上这是很人性化的功能&#xff0c;可是对很多人来说可能用不到&#xff0c;而且很繁琐&#xff0c;下面…

Java中“==”和equals方法的区别

目录 一、“”举例 二、equals举例 区别如下&#xff1a; &#xff08;1&#xff09;“”既可以用在基本数据类型&#xff0c;也可以用在引用数据类型&#xff1b;如果用在基本数据类型上&#xff0c;那么比较时比较的是具体的值&#xff0c;如果用在引用数据类型&#xff0c…