Pinia基本使用

news2025/7/16 10:32:41

文章目录

  • 1. 介绍
  • 2. Pinia 和 Vuex
  • 3. 安装和基本使用
  • 4. pinia修改数据状态
  • 5. pinia持久化处理
  • 6. 自定义插件


1. 介绍

它是2019 年 11 月对于新版本的vue提供的组合Api进行的尝试,它可以很好的集合vue新的api方法,且还很好的支持ts的写法,Pinia已经被纳入官方代码仓库中,也可以理解为Pinia为最新版本的vuex5。

在这里插入图片描述

2. Pinia 和 Vuex

  • Vuex:namespaced State、Gettes、Mutations(同步)、Actions(异步)
  • Pinia: State、Gettes、Actions(同步异步都支持)

Vuex 当前最新版是 4.x

  • Vuex4 用于 Vue3
  • Vuex3 用于 Vue2

Pinia 当前最新版是 2.x,它即支持 Vue2 也支持 Vue3。就目前而言 Pinia 是我们在vue3 项目中的首选,尤其是 TypeScript 的项目。

3. 安装和基本使用

安装:

yarn add pinia

使用:

  1. 在入口文件进行初始化(main.js):

    // 创建vue入口程序,由原来的类实例,变成现在的函数方式,为了更好在打包时优化代码
    import { createApp } from 'vue'
    // 根组件
    import App from './App.vue'
    // 路由
    import router from './router'
    
    import createGlobalComponent from './components'
    import globalProperties from './config/globalProperties'
    
    // pinia
    import { createPinia } from 'pinia'
    
    // pinia配置
    const pinia=createPinia()
    
    // 工作中常用写法:
    createApp(App)
      .use(createGlobalComponent)
      .use(globalProperties)
      .use(router)
      .use(pinia)
      .mount('#app')
    
  2. 创建 pinia 模块(pinia/film.js):

    import { defineStore } from 'pinia'
    
    // 参数1:命名空间名称
    // 参数2:对象,配置 state getters actions
    const useFilmStore = defineStore('film',{
      state:()=>({
        num:100
      }),
      actions:{
    
      }
    })
    export default useFilmStore
    
  3. 电影页面:

    <template>
      <div>
        <h3>电影列表 -- {{ store.num }} -- {{num}}</h3>
        <button @click="addNum">++++</button>
      </div>
    </template>
    
    <script setup>
    import { storeToRefs } from 'pinia';
    // 状态是完全独立的一个模块
    import useFilmStore from '../pinia/film';
    
    const store = useFilmStore()
    
    // 使用 storeToRefs 可以解构出来 state 中的属性,而且它还保持响应式
    const { num } = storeToRefs(store)
    
    // pinia不用通过commit方法更改数据,可以直接在组件中更改数据,并且是响应式的
    const addNum = () => {
      store.num++
    }
    
    </script>
    
    <style lang="scss" scoped>
    
    </style>
    

4. pinia修改数据状态

电影页面:

<template>
  <div>
    <h3>电影列表 -- {{ store.num }} -- {{ num }}</h3>
    <ul>
      <li v-for="item of store.arr" :key="item">{{ item }}</li>
    </ul>
    <button @click="addNum">++++</button>
  </div>
</template>

<script setup>
import { storeToRefs } from 'pinia';
// 状态是完全独立的一个模块
import useFilmStore from '../pinia/film';

const store = useFilmStore()

// 使用 storeToRefs 可以解构出来 state 中的属性,而且它还保持响应式
const { num } = storeToRefs(store)

// pinia不用通过commit方法更改数据,可以直接在组件中更改数据,并且是响应式的
const addNum = () => {
  // 方案一:直接修改 state 中的数据,这种方式无法进行批处理,如果修改的属性过多,性能不高
  // store.num++

  // 方案2:批处理,如果一次性修改多个属性建议用$patch来完成,性能更高
  // store.$patch({
  //   num: store.num + 1,
  //   arr: store.arr.concat(Date.now())
  // })

  // 方案2回调函数写法:批处理,回调函数写法来批量修改,这样可以防止$patch如果进行了对象合并,批处理数据不完整的情况出现
  // store.$patch(state => {
  //   store.num + 1
  //   store.arr.push(Date.now())
  // })

  // 方案3:调用pinia模块下的actions中的方法,完成数据更新
  store.addNum(1)
}

</script>

<style lang="scss" scoped>

</style>

pinia/film.js:

import { defineStore } from 'pinia'

// 参数1:命名空间名称
// 参数2:对象,配置 state getters actions
const useFilmStore = defineStore('film', {
  state: () => ({
    num: 100,
    arr: [1, 2, 3]
  }),
  actions: {
    addNum(n) {
      // 方案1
      // 同步
      this.num += n
      // 异步
      setTimeout(() => {
        this.num += n
      }, 1000)

      // 方案2
      this.$patch(state=>{
        state.num+=n
        state.arr.push(Date.now())
      })
    },
  }
})
export default useFilmStore

在这里插入图片描述

5. pinia持久化处理

安装:

yarn add pinia-plugin-persistedstate@2

入口文件中导入:

// pinia中数据持久化
import { persistedState } from 'pinia-plugin-persistedstate'

pinia.use(persistedState)

在pinia模块中使用:

import { defineStore } from 'pinia'

// 参数1:命名空间名称
// 参数2:对象,配置 state getters actions
const useFilmStore = defineStore('film', {
  // 当前pinia模块中的所有的数据进行持久化处理
  // 默认使用的是 localStorage,且它存储在 localStorage 中的 key 的名称为命名空间名称[id名称]
  // persist: true,

  // 指定模块中要持久化的数据
  persist: {
    // 指定要持久化的 state 对象中的属性名称
    paths: ['num'],
    // 自定义localStorage中的key的名称,一般不修改
    key: 'filmstore',
    // 自定义使用localStorage还是sessionStorage存储介质
    storage: window.sessionStorage
  },

  state: () => ({
    num: 100,
    arr: [1, 2, 3]
  }),
  actions: {
    addNum(n) {
      // 方案1
      // 同步
      this.num += n
      // 异步
      setTimeout(() => {
        this.num += n
      }, 1000)

      // 方案2
      this.$patch(state => {
        state.num += n
        state.arr.push(Date.now())
      })
    },
  }
})
export default useFilmStore

在这里插入图片描述

6. 自定义插件

Pinia中文文档:https://pinia.web3doc.top/core-concepts/plugins.html

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

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

相关文章

web前端-javascript-运算符的优先级(如果遇到的优先级不清楚的,可以使用()来改变优先级)

文章目录运算符的优先级1. , 运算符2. 优先级2.1. 就和数学中一样&#xff0c;在 JS 中运算符也有优先级2.2. 在 JS 中有一个运算符优先级的表2.3. 但是这个表我们并不需要记忆2.3. &&和||的优先级运算符的优先级 var a, b, c;//var a1, b2 , c3; //alert(b);//var re…

sql server如何卸载干净?来看这里

一、如何卸载干净 1.关闭服务 快捷键&#xff1a;windows R&#xff0c;在命令行输入&#xff1a; services.msc&#xff0c;把有关SQL都关闭 &#xff0c;下图所示&#xff1a; 2.到控制面板&#xff0c;卸载 sql server 3.删除磁盘里的文件 我的在c盘里&#xff0c;看各位…

你了解专利的快速预审嘛?

随着经济的发展和科技创新步伐的加快&#xff0c;我国专利申请量的增长速度已大大高于专利审结的速度。专利审查周期的长短不仅影响企业对市场的可预期性&#xff0c;而且影响专利系统对技术创新的产出和扩散的激励作用的发挥。过长的专利审查周期可能会影响企业的竞争预期和获…

[附源码]java毕业设计影院售票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

为什么选择WordPress作为企业CMS?

WordPress 是世界上最受欢迎的内容管理系统 (CMS)。它为超过40% 的网站和超过 64% 的使用 CMS 的网站提供支持。它易于使用和定制。但它是企业网站的最佳选择吗&#xff1f; 随着大公司意识到它能够构建一个可以根据他们的需求扩展的强大网站的能力&#xff0c;WordPress持续流…

JVM知识体系学习一:JVM基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用

文章目录前言一、JVM基础1、cross platform 跨平台2、cross language 跨语言3、什么是JVM呢&#xff1f;一张图告诉你4、java从编码到执行*****5. 从跨平台的语言到跨语言的平台6. jvm与class文件格式7. JVM8. javac的过程9. 常见的JVM实现10. JDK JRE JVM二、Class File Forma…

Java多线程(二)——Thread类的相关方法

Thread类的构造方法 Thread() class MyThread extends Thread {Overridepublic void run() {System.out.println("hello Thread");} } public class ThreadDemo {public static void main(String[] args) {Thread t new MyThread();t.start();System.out.println(&…

java数据结构与算法 --- 第十章 数结构基础

第十章 树结构基础 I 引和基本概念 为什么需要树结构? 数组,查询快,增删慢 链表… 而树结构,同时提高查询和增删! 基本概念 术语: 有手就行 II 二叉树 1.概念: 二叉树:每个节点最多有两个子节点的数叫二叉树 满二叉树: 所有叶子节点都在最后一,结点的总数是2^n-1(n是层数…

jeecg-boot中上传图片到华为云obs云存储中

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 前言 jeecg-boot框架中&#xff0c;其实对接的功能还是挺多的&#xff0c;其中就有文件云存储服务器&#xff0c;不过是阿里云oss的&#xff0c;那如果我们使用的是七牛云&#xff0c;或…

通过TortoiseGit钩子实现提交前检查作者信息是否正确

1、需求背景 从事嵌入式开发的人运行软件依赖于特定的电脑硬件&#xff0c;可能会存在多人在同一台电脑上开发的需求。 我们使用git进行软件代码版本管理&#xff0c;通过提交时的用户名和邮箱区分某次代码是哪个人提交的信息。git自身支持提交的时临时一次设置成其他的用户信…

01.OpenWrt-写在前面

01.OpenWrt-写在前面 1.1 如何学好OpenWrt OpenWrt究竟应该怎么学,这是我一直在思考的问题! 谈到OpenWrt有相关软硬件知识的人会想到路由器,路由器是OpenWrt系统最主要的使用场景.OpenWrt是基于Linux系统构建起来的,所以其他Linux系统能够做的事情OpenWrt都是可以做到. Ope…

GD32F4(10):GD32转RS422在115200下接收乱码分析

GD32F450&#xff1a;串口转RS485在115200下接收乱码 文章目录GD32F450&#xff1a;串口转RS485在115200下接收乱码1. 知识储备2. 环境3. 操作4. 插入一个知识点&#xff1a;不同MCU串口ip核实现原理4.1 首先我们来看一下STM32f的串口是怎样识别数据的4.2 GD32F4串口识别5. 我的…

毕业设计-基于机器视觉道路视频车道线检测

目录 前言 课题背景和意义 实现技术思路 摄像机校准 ​编辑 透视变换 车道像素查找 识别车道面积 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要…

电商商家必用的4大TikTok营销变现增长技巧

数据显示&#xff0c;TikTok是目前最热门的海外社交媒体平台&#xff0c;已超过多家老牌社媒平台。由于是个短视频平台&#xff0c;在当下环境里具有很强的营销推广优势&#xff0c;很多电商商家都会选择在TikTok营销产品。那电商商家必用哪些TikTok营销变现增长技巧呢&#xf…

基于决策树的智能网络安全入侵检测模型

基于决策树的智能网络安全入侵检测模型学习目标&#xff1a;学习内容&#xff1a;该论文模型下载数据集参考论文&#xff1a;综述/调查&#xff1a;申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计4077字&…

设备全生命周期管理第一股凌雄科技上市,京东、腾讯等长期看好

“设备全生命周期管理第一股”凌雄科技&#xff08;小熊U租&#xff09;于昨日正式在港交所挂牌上市。本次上市&#xff0c;凌雄科技的IPO发行价为7.60港元/股&#xff0c;募集资金净额约为3.372亿港元&#xff0c;上市时的总市值达到26.85亿港元。 特别说明的是&#xff0c;凌…

适用更多会议场景,华为云会议的分组讨论功能来了!

适用更多会议场景&#xff0c;华为云会议的分组讨论功能来了&#xff01; 如今&#xff0c;线上沟通成为常态&#xff0c;线上会议更是成为工作推进过程中不可缺少的环节。但在一些场景中&#xff0c;例如在跨部门协调&#xff0c;沙龙研讨&#xff0c;教育培训或者招聘面试时&…

索引生命周期管理ILM看完不懂你锤我

阅读完本文你可以学到什么是索引生命周期管理&#xff0c;各个阶段可以做的操作以及如何使用索引模版使用索引生命周期策略&#xff0c;下面就跟我一起来吧 基础理论篇 索引生命周期管理&#xff08;ILM&#xff09;是一种可以让我们随着时间推移自动化的管理索引的一种方式。…

SpringBoot SpringBoot 原理篇 1 自动配置 1.1 bean 的加载方式【一】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.1 bean 的加载方式【一】1.1.1 环境准备1.1.2 第一种方式1.1.3 第…

Go-Excelize API源码阅读(三十四)——RemoveRow

Go-Excelize API源码阅读&#xff08;三十四&#xff09;——RemoveRow 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源&a…