Pinia基础使用 (vite vue3)

news2024/11/14 13:39:55

pinia

Pinia 概念

是 Vue 的存储库,它允许您跨组件/页面共享状态。 Vue官方推荐状态库

Pinia 的优点

pinia 符合直觉,易于学习。
pinia 是轻量级状态管理工具,大小只有1KB.
pinia 模块化设计,方便拆分。
pinia 没有 mutations,直接在 actions 中操作 state,通过 this.xxx 访问响应的状态,尽管可 以直接操作 state,但是还是推荐在 actions 中操作,保证状态不被意外的改变。
store 的 action 被调度为常规的函数调用,而不是使用 dispatch 方法或者是 MapAction 辅助函数,这是在 Vuex 中很常见的。
支持多个 store。
支持 Vue devtools、SSR、webpack 代码拆分。

什么时候使用Store

存储应该包含可以在整个应用程序中访问的数据。这包括在许多地方使用的数据
避免可以托管在组件的数据使用Store

创建项目(vite + vue3 + pinia):

pnpm create vite
cd project
pnpm i
pnpm i pinia
pnpm run dev

如果您的应用使用 Vue 2,您还需要安装组合 API:@vue/composition-api
创建一个pinia(根存储):

如果是 vue 3.2 + pinia 2.1.4版本,可能由以下报错:
import { hasInjectionContext,inject,toRaw,watch,…
在这里插入图片描述
是由于版本不兼容导致的

在package.json升级vue到3.3.4版本即可

基本使用

(1)创建一个 pinia(根存储)并将其传递给应用程序
修改main.js

import { createPinia } from 'pinia'
createApp(App).use(pinia).mount('#app')

(2) src下新建store文件夹,然后在store下创建counter.js文件

defineStore参数:
第一个参数是唯一的 id, 标志着一个命名空间
第二个参数是一个对象, 有三个模块: state, getters,actions

const useCounter = defineStore("counter", {
  state () {
    return {
      count: 66,
    }
  },
  getters: {
  },
  actions: {
  }
})
// 返回函数统一使用useXXX命名
export default useCounter;

(3) 在组件中使用:
修改,定义组件

<template>
  <div>展示pinia的counter的counter值: {{ counterStore.count }}</div>
  <div>解构出来的pinia的counter的count值: {{ count1 }}</div>
  <div>storeToRefs: {{ count2 }}</div>
  <button @click="addCount">count+1</button>
</template>

<script setup>
import useCounter from '../stores/counter'
import {storeToRefs} from 'pinia'
const counterStore = useCounter()
const {count1} = counterStore // 解构得到的失去响应式
const {count2} = storeToRefs(counterStore) // 不会失去响应式

function addCount() {
  counterStore.count++
}

修改App.vue,使用组件

<template>
  <Counter1/>
</template>

<script setup>
import Counter1 from './components/Counter1.vue'
</script>

(4) Store获取后不能解构, 否则失去响应式

const {count} = counterStore

解决方案:
提供了函数storeToRefs解决,作用就是把结构的数据使用ref做代理

import {storeToRefs} from 'pinia'
const counterStore = useCounter()
const {count} = storeToRefs(counterStore)

(5)修改state的数据

重新新建一个user模块store/user.js

import {defineStore} from 'pinia'

const useUser = defineStore("user", {
  state:() => ({
    name: "cq",
    age: 17
  })
})

export default useUser

新建组件 ChangeVaule.vue:
有几种修改state的方法

<template>
<div>
  <h2>名字是:{{ name }}</h2>
  <h2>年龄是: {{ age }}</h2>
  <button @click="updateStore">修改Store数据</button>
  <button @click="resetStore">重置Store数据</button>
</div>
</template>

<script setup>
import useUser from '../stores/user'
import { storeToRefs } from 'pinia';

const userStore = useUser()
const {name, age} = storeToRefs(userStore)

function updateStore() {
  // 1. 一个个修改状态
  // userStore.name = "川崎"
  // userStore.age = 19

  // 2. $patch一次改变多个状态
  userStore.$patch({
    name: "川川",
    age: 18
  })

  // 3. $state(替换, 基本不用)
}

function resetStore() {
  // 4. $reset()是重置state数据的
  userStore.$reset()
}
</script>

getters的使用:

getters类似于vue的计算属性,可以对已有的数据进行修饰。不管调用多少次,getters中的函数只会执行一次,而且会缓存

(1) 最基本使用
在store/counter.js添加getters:

const useCounter = defineStore("counter", {
  state:() => ({
    count:66,
  })
  getters: {
    doubleCount(state) {
      doubleCount(state) {
          return state.count * 2
      }
    }
  }
})

export default useCounter

在组件中使用:

<div>
  <h1>getters使用: </h1>
  <h2>doubleCount:{{counterStore.doubleCount}}</h2>
</div>

(2)一个getter引入另一个getter
counter模块:

getters: {
  doubleCount(state) {
    return state.count * 2
  },
  doubleCountAddTwo() {
    console.log(this)
    return this.doubleCount + 2
  }
}

组件中使用:

<div>
  <h2>doubleCount: {{counterStore.doubleCount}}</h2>
  <h2>doubleCountAddTwo: {{counterStore.doubleCountAddTwo}}</h2>
</div>

运行且看看getters的this打印:

在这里插入图片描述
this中有两个getters

(3) getters中使用别的store数据
在counter模块中拿user模块store数据

count模块的getters添加:

import useUser from "./user"
...
 showMessage(state){
     console.log(state);
     console.log(this)
     //获取user信息,拿到useUser模块
     const userStore = useUser()
     //拼接信息
     return `name:${userStore.name}--count:${state.count}`
 }

在组件中使用:

<div>
  <h2>showMessage:{{counterStore.showMessage}}</h2>
</div>

结果:
在这里插入图片描述
实现了counter模块中拿到了user模块的数据

actions的使用:

actions可以处理同步,也可以处理异步,类似于methods

(1) 同步使用:
counter模块使用:
在actions定义两个函数一个加1函数,一个加Num函数

  actions: {
    increment(state) {
      console.log(state)
      console.log(this)
      this.count++
    },

    incrementNum(num) {
      this.count += num
    },

组件中使用:

    <h2>展示pinia的counter的counter值: {{ counterStore.count }}</h2>
    <h2>doubleCountAddTwo:{{ counterStore.doubleCountAddTwo }}</h2>

    <button @click="incrementOne">count+1</button>
    <button @click="incrementNum">count+20</button>

在这里插入图片描述

点击count+1 ⇒ 加一
点击count+20 ⇒ 加二十

(2) 异步操作使用
在actions处理异步的时候,异步是与async和await连用

在actions中添加:

    // 异步操作
    async getData() {
      const res =await new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve([11,22,33,44])
        }, 2000)
      })

      this.list = res
      return "ok"
    }

新建组件AsyncChangeData.vue:

<template>
  <!-- 遍历store的数据 -->
  <div v-for="item in counterStore.list">{{ item }}</div>
</template>

<script setup>
import useCounter from '../stores/counter'
const counterStore = useCounter()

counterStore.getData().then(res =>{
console.log("成功",res);
})
</script>

可以看到异步数据延迟显示

数据持久化:

(1) 添加库:

npm i pinia-plugin-persist

(2) 在store中添加:

  persist: {
    enabled: true, // 开启缓存  默认会存储在本地localstorage
    storage: sessionStorage, // 缓存使用方式
    paths:[] // 需要缓存键 
  },

在这里插入图片描述
可以看到session中存储的信息

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

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

相关文章

Linux多进程数据交换--共享内存

个人博客地址: https://cxx001.gitee.io 基础 在linux系统开发当中&#xff0c;时常需要在多个进程之间交换数据&#xff0c;在多个进程之间交换数据&#xff0c;有很多方法&#xff0c;但最高效的方法莫过于共享内存。 linux共享内存是通过tmpfs这个文件系统来实现的&#x…

【漏洞案例】记一次aws-key泄露导致火币交易所被攻击案例

全球最大的加密货币交易所之一火币悄然修复了一个数据泄露事件&#xff0c;该泄露事件可能导致该公司的云存储被访问。火币无意中共享了一组凭证&#xff0c;授予其所有 Amazon Web Services S3 存储桶写入权限。 该公司使用 S3 存储桶来托管其 CDN 和网站。任何人都可以使用这…

shell中sed命令常用用法总结

1、sed命令匹配文本内容进行替换 #-i 可以直接在原始文本中匹配替换&#xff0c;s/匹配内容/需要替换的内容/g &#xff0c;g是以一行为全局&#xff0c;有g说明每行中匹配到的都需要替换&#xff0c;没有g说明&#xff0c;只需要替换每行中的第一个匹配到的。 sed -i s/pool …

前端 鱼骨图 elenemt ui

展示图 代码 <template><div><divclass"fishbone":style"{ height: calc((${topChiderH} ${topChiderH}) 33px) }"><div class"top-box"><divclass"flex-items"ref"topChilderen":style"…

使用预训练CNN生成图像嵌入(image embeddings)

文章目录 什么是图像嵌入&#xff1f;来自 Kaggle 的狗品种图像数据集从狗品种图像数据集生成图像嵌入参考 什么是图像嵌入&#xff1f; 图像嵌入是图像的低维表示。换句话说&#xff0c;它是图像的密集向量表示&#xff0c;可用于分类等许多任务。 例如&#xff0c;这些深度…

(0020) H5-Vue-router+Element-ui 搭建非常简单的dashboard

参考学习&#xff1a; Vue Vue-router Element-ui 搭建一个非常简单的dashboard demo demo参考&#xff1a;https://github.com/wangduanduan/vue-el-dashboard 在线预览 效果图&#xff1a; 使用到的技术&#xff1a; Vue Vue-router Element-ui webpack Normalize.css v…

final关键字 抽象类

final关键字 可以修饰类、属性、方法和局部变量【参数】。 使用场景 1、当不希望 类被继承时&#xff0c;可以用final修饰。比如不希望子类重写父类时。 2、当不希望子类重写父类的某个方法。注意&#xff1a;此时不能重写但能继承父类此方法使用。 3、当不希望类的某个属…

windows下在注册表中添加右键pycharm打开目录

1、winregedit打开注册表&#xff0c;并在shell下创建项&#xff0c;修改如下图右侧内容 2、在PyCharm下创建command项&#xff0c;并修改其内容 3、重启电脑 4、显示

比ping还好用的排障命令

遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的&#xff0c;是Traceroute排障命令详解&#xff0c;给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED 思科 4000 系列集成服务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-4000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 4000 系列…

Matlab无人机算法开发套件上新,快速实现控制算法到无人机平台的移植

在现有的旋翼无人机市场中&#xff0c;绝大部分可二次开发的产品都只提供C、C等SDK&#xff0c;但在科研类无人机这一细分领域中&#xff0c;更多的开发者偏好或善于使用Matlab进行算法的开发和验证。为了助力从事控制算法理论研究的开发者&#xff0c;能够独立完成控制算法到无…

举例说明什么是循环神经网络

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种处理时间序列数据和自然语言等具有顺序信息的数据的神经网络模型。与普通的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;RNN具有循环连接&#xff0c;使得网络能…

【Java】-【IDEA 编译项目时报错:GC overhead limit exceeded】

文章目录 问题简述问题分析解决方案解决方案一解决方案二 问题简述 以前项目启动都是好好的&#xff0c;没有任何问题&#xff0c;最近启动时却报错&#xff1a; java.lang.OutOfMemoryError: ...(此处忽略) GC overhead limit exceeded问题分析 错误是发生在编译阶段&#…

STM32单片机CAN总线汽车灯光控制系统远近光刹车双闪

实践制作DIY- GC0151---CAN总线汽车灯光控制系统 基于STM32单片机设计---CAN总线汽车灯光控制系统 二、功能介绍&#xff1a; OLED主控板&#xff1a;STM32F103C系列最小系统OLED显示3个按键&#xff08;大灯开关、大灯自动/手动、大灯近光/远光&#xff09;左转按键右转按键双…

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

超参数调试、Batch正则化和程序框架

1、归一化网络的激活函数&#xff08;Normalizing activations in a network &#xff09; 规范化&#xff0c;方法如下&#xff0c;减去均值再除以标准偏差&#xff0c;为了使数值稳定&#xff0c; 通常将&#x1d700;作为分母&#xff0c;以防&#x1d70e; 0的情况 &…

使用maven profile 实现一次打包多版本依赖的fat jar

基于一种特殊情况: 需要开发通用代码,但底层依赖的jar有不同版本,使用一次maven 命令编译来同时生成多个fat jar。 测试代码结构: log4j-v1/log4j-v2 有一个同名类被maintest引用。 maintest pom.xml如下 <?xml version="1.0" encoding="UTF-8"…

Docker的安装以及Docker私有仓库的搭建

Docker的安装 # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manage…

基于QT设计的无人机地面站(摄像头录像拍摄)

一、功能需求 通过QT设计一款无人机地面站软件,需要包含基本的RTSP拉流功能,对接无人机平台的RTSP流。此外,需要完成拍照、录像、OSD叠加功能;完成按钮控制云台进行拍照、录像、变焦、指点运动等。在此基础上,完成对应的目标跟踪识别。 技术要求 (1)采用QT平台,设计W…

一、QT主界面简介和创建一个QT工程

QT从入门到实战学习笔记 一、QtCreator主界面简介1、欢迎界面2、编辑界面3、设计界面4、Debug界面5、帮助界面6、主界面左下角按钮 二、创建QT工程1、创建一个新的project2、模板选择3、项目介绍和位置4、定义所建的系统文件类型5、创建类信息&#xff08;Details&#xff09;6…