当前位置: 首页 > news >正文

Vue3-Pinia状态管理器

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的话,你可能会认为可以通过一行简单的 export const state = reactive({}) 来共享一个全局状态。对于单页应用来说确实可以,但如果应用在服务器端渲染,这可能会使你的应用暴露出一些安全漏洞。 而如果使用 Pinia,即使在小型单页应用中,你也可以获得如下功能:

  • Devtools 支持
    • 追踪 actions、mutations 的时间线
    • 在组件中展示它们所用到的 Store
    • 让调试更容易的 Time travel
  • 热更新
    • 不必重载页面即可修改 Store
    • 开发时可保持当前的 State
  • 插件:可通过插件扩展 Pinia 功能
  • 为 JS 开发者提供适当的 TypeScript 支持以及自动补全功能。
  • 支持服务端渲染

快速上手

第一步:`npm install pinia`

第二步:操作`src/main.ts`

import { createApp } from 'vue'
import App from './App.vue'/* 引入createPinia,用于创建pinia */
import { createPinia } from 'pinia'/* 创建pinia */
const pinia = createPinia()
const app = createApp(App)/* 使用插件 */{}
app.use(pinia)
app.mount('#app')

存储+读取数据

1. `Store`是一个保存:**状态**、**业务逻辑** 的实体,每个组件都可以**读取**、**写入**它。

2. 它有三个概念:`state`、`getter`、`action`,相当于组件中的: `data`、 `computed` 和 `methods`。

3. 具体编码:`src/store/count.ts`

// 引入defineStore用于创建store
import {defineStore} from 'pinia'// 定义并暴露一个store
export const useCountStore = defineStore('count',{// 动作actions:{},// 状态state(){return {sum:6}},// 计算,类似于计算属性getters:{}
})

组件中使用state中的数据

<template><h2>当前求和为:{{ sumStore.sum }}</h2>
</template><script setup lang="ts" name="Count">// 引入对应的useXxxxxStore	import {useSumStore} from '@/store/sum'// 调用useXxxxxStore得到对应的storeconst sumStore = useSumStore()
</script>

修改数据

直接修改

countStore.sum = 666

批量修改

countStore.$patch({sum:999,school:'atguigu'
})

使用方法修改

import { defineStore } from 'pinia'export const useCountStore = defineStore('count', {/*************/actions: {//加increment(value:number) {if (this.sum < 10) {//操作countStore中的sumthis.sum += value}},//减decrement(value:number){if(this.sum > 1){this.sum -= value}}},/*************/
})
// 使用countStore
const countStore = useCountStore()// 调用对应action
countStore.incrementOdd(n.value)

storeToRefs

  • 借助storeToRefsstore中的数据转为ref对象,方便在模板中使用。

  • 注意:pinia提供的storeToRefs只会将数据做转换,而VuetoRefs会转换store中数据。

<template><div class="count"><h2>当前求和为:{{sum}}</h2></div>
</template><script setup lang="ts" name="Count">import { useCountStore } from '@/store/count'/* 引入storeToRefs */import { storeToRefs } from 'pinia'/* 得到countStore */const countStore = useCountStore()/* 使用storeToRefs转换countStore,随后解构 */const {sum} = storeToRefs(countStore)
</script>

getters

    1. 概念:当`state`中的数据,需要经过处理后再使用时,可以使用`getters`配置。

    2. 追加```getters```配置。

// 引入defineStore用于创建store
import {defineStore} from 'pinia'// 定义并暴露一个store
export const useCountStore = defineStore('count',{// 动作actions:{/************/},// 状态state(){return {sum:1,school:'atguigu'}},// 计算getters:{bigSum:(state):number => state.sum *10,upperSchool():string{return this. school.toUpperCase()}}
})

组件中读取数据

const {increment,decrement} = countStore
let {sum,school,bigSum,upperSchool} = storeToRefs(countStore)

$subscribe

通过 store 的 `$subscribe()` 方法侦听 `state` 及其变化,觉得有点像watch

talkStore.$subscribe((mutate,state)=>{console.log('LoveTalk',mutate,state)localStorage.setItem('talk',JSON.stringify(talkList.value))
})

store组合式写法

import {defineStore} from 'pinia'
import axios from 'axios'
import {nanoid} from 'nanoid'
import {reactive} from 'vue'export const useTalkStore = defineStore('talk',()=>{// talkList就是stateconst talkList = reactive(JSON.parse(localStorage.getItem('talkList') as string) || [])// getATalk函数相当于actionasync function getATalk(){// 发请求,下面这行的写法是:连续解构赋值+重命名let {data:{content:title}} = await axios.get('https://api.uomg.com/api/rand.qinghua?format=json')// 把请求回来的字符串,包装成一个对象let obj = {id:nanoid(),title}// 放到数组中talkList.unshift(obj)}return {talkList,getATalk}
})

相关文章:

  • 【考研数据结构知识点详解及整理——C语言描述】第二章 线性表顺序存储结构上的基本操作——顺序表的插入操作
  • 【ZZULI数据结构实验四】:C语言排序算法大比拼
  • 计算机网络期末知识总结(第一章)
  • Kylin入门教程介绍
  • 雪花算法详解及源码分析
  • 爬虫面试手册
  • HTML基本元素包含HTML表单验证
  • 自友科技破解走班教育排课难题
  • 尚品汇项目
  • c++与c
  • 云原生和“可移植性”到底意味着什么
  • @vue-office/excel 解决移动端预览excel文件触发软键盘
  • docker命令 docker ps -l 命令在 Docker 中用于列出最近一次创建的容器
  • Vue3生命周期
  • 【深度学习】温故而知新4-手写体识别-多层感知机+CNN网络-完整代码-可运行
  • 【Leetcode】101. 对称二叉树
  • 2017届校招提前批面试回顾
  • 2019.2.20 c++ 知识梳理
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android 架构优化~MVP 架构改造
  • Effective Java 笔记(一)
  • HTTP中的ETag在移动客户端的应用
  • node-glob通配符
  • SQLServer之创建数据库快照
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue脚手架vue-cli
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 深入浅出webpack学习(1)--核心概念
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一道闭包题引发的思考
  • 异步
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 仓管云——企业云erp功能有哪些?
  • ​业务双活的数据切换思路设计(下)
  • # .NET Framework中使用命名管道进行进程间通信
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (1)(1.13) SiK无线电高级配置(六)
  • (11)MATLAB PCA+SVM 人脸识别
  • (Charles)如何抓取手机http的报文
  • (Ruby)Ubuntu12.04安装Rails环境
  • (翻译)terry crowley: 写给程序员
  • (算法设计与分析)第一章算法概述-习题
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)为C# Windows服务添加安装程序
  • .bat批处理出现中文乱码的情况
  • .net core Swagger 过滤部分Api
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET基础篇——反射的奥妙
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中两种OCR方式对比
  • :class的用法及应用
  • ??在JSP中,java和JavaScript如何交互?