Vue状态管理库-Pinia

一、Pinia是什么?

Pinia 是 Vue 的专属状态管理库,它允许支持跨组件或页面共享状态,即共享数据,他的初始设计目的是设计一个支持组合式API的 Vue 状态管理库(因为vue3一个很大的改变就是组合式API),当然这并不是说Pinia只支持vue3,他是同时支持vue2和vue3的,本文倾向于拥抱Vue3,所以代码语法都是倾向用组合式api的写法

二、在vue3中使用Pinia

下面的流程和相关代码均基于vue3项目

1、安装pinia

npm install pinia

或用yarn安装

yarn add pinia

package.json中看到pinia表示安装成功 

2、创建pinia实例并将其传递给应用

//src/main.js//创建应用实例
import { createApp } from "vue";
import App from "./App.vue";
let app = createApp(App);//pinia实例
import { createPinia } from "pinia";
let pinia = createPinia();
app.use(pinia);app.mount("#app");

挂载完成后,我们就可以在Vue的devtools里看到Pinia了

3、定义Store

Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字,在整个应用中保持唯一, 返回的函数命名为 use... 是一个符合组合式函数风格的约定

import { defineStore } from "pinia";//命名规则,建议以 `use` 开头且以 `Store` 结尾,即 use~~~Store
export const useMapStore = () => {// 其他配置...
}

Setup store(Option Store可以查看官方,本文不列举)

import { defineStore } from "pinia";
import { reactive, computed } from "vue";
import type { City, Province } from "@/interface/common";export const useMapStore = defineStore("mapStore", () => {//statelet cityList = reactive<Array<City>>([]);let provinceList = reactive([]);//getterconst simpleCityList = computed(() => {return cityList.filter((item) => item.code != "110000");});//actionsfunction changeCityList(list: City[]) {console.log("修改城市列表数据的事件被触发");cityList = Object.assign(cityList, list);}function changeProviceList(list: Province[]) {console.log("修改省份列表数据的事件被触发");provinceList = Object.assign(provinceList, list);}return {cityList,provinceList,simpleCityList,changeCityList,changeProviceList,};
});

 

4、使用store

<template><div>您好!欢迎来到星野的小世界</div><div>星野的目标是走遍中国的每一个省,中国的省如下:</div><div><ul><li v-for="city in cityList" :key="city.code">{{ city.name }}</li></ul></div>
</template><script setup lang='ts' name='Login'>
import { onMounted} from 'vue';
import { storeToRefs } from 'pinia';
import { getCityList } from "@/utils/common";
import { useMapStore } from '@/stores/map'let mapStore = useMapStore()
let { cityList } = storeToRefs(mapStore) //为了从 store 中提取属性时保持其响应性,需要使用 storeToRefs()。它将为每一个响应式属性创建引用onMounted(async () => {let list = await getCityList()mapStore.changeCityList(list) //修改store里的属性数据
})
</script>
<style lang='scss' scoped></style>

getCityList是一个工具函数,调用一个免费api获取中国的城市数据 

在 Setup Store 中:

  • ref() /reactive ( ) 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions

页面效果

5、修改store中的state

例如store中的state有一个城市统计属性: cityCount

在业务组件里,就可以通过mapStore.cityCount 直接修改数量

 

如果state有很多属性,还可以调用 $patch 方法。它允许你用一个 state 的补丁对象在同一时间更改多个属性

 mapStore.$patch({cityCount: mapStore.cityCount + 1,provinceCount: mapStore.provinceCount + 1})

好啦,Pinia 满足基础使用的读写改操作已经描述完毕,关于搭配 Nuxt 的 Pinia 完成SSR,后续会单独出文,敬请期待!😁

ps: 学习成长过程的简单记录,如有不恰当之处,欢迎交流

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

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

相关文章

DBeaver使用遇到的问题汇总

文章目录 1、Dbeaver一次性执行多条sql语句2、执行外部sql文件3、sql编辑器显示行号 1、Dbeaver一次性执行多条sql语句 右键连接&#xff0c;编辑连接&#xff0c;将连接设置中、驱动属性中allowMultiQueries从 默认的false改为true就行。 参考博客&#xff1a;使用DBeaver一…

基于springboot+vue的高校学科竞赛系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

黑色金属冶炼5G智能工厂数字孪生可视化管控系统,推进金属冶炼行业数字化转型

黑色金属冶炼5G智能工厂数字孪生可视化管控系统&#xff0c;推进金属冶炼行业数字化转型。随着科技的不断发展&#xff0c;数字化转型已经成为各行各业发展的必然趋势。金属冶炼行业作为传统工业的重要组成部分&#xff0c;也面临着数字化转型的挑战和机遇。为了推进金属冶炼行…

初阶数据结构之---顺序表和链表(C语言)

引言-线性表 线性表&#xff1a; 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构。线性表在逻辑上是线性结构&#xff0c;也就是说是连续的一条直线。但在物理上并不一定是连续的。线性表在物理上…

[法规规划|方案实操]财政部会计司《企业数据资源入表专题培训》内容要点及实例解析

财政部会计司《企业数据资源相关会计处理暂行规定》专题线上培训 一。制定背景 随着大数据等信息技术、互联网等基础设施的不断演进&#xff0c;数字经济和产业得到飞速发展&#xff0c;并持续推动生产方式、生活方式和社会治理方式的深入变革&#xff0c;数字产业化和产业数字…

程序员是否应该让电脑保持24小时开启:效率与能耗的权衡之争**

链接&#xff1a;华为OD机考原题附代码 程序员为什么不喜欢关电脑&#xff1f; 你是否注意到&#xff0c;程序员们似乎从不关电脑&#xff1f;别以为他们是电脑上瘾&#xff0c;实则是有他们自己的原因&#xff01;让我们一起揭秘背后的原因&#xff0c;看看程序员们真正的“…

React 模态框的设计(一)拖动组件的设计

春节终结束了&#xff0c;忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果&#xff1a; 这是一个简单的组件设计&#xff0c;如果用原生的js设计就很简单&#xff0c;但在React中有些事件必须要多考虑一些。这是一个系列的文章&#xff0c;…

边缘计算物联网关在生产场景中的应用-天拓四方分享

随着物联网技术的飞速发展&#xff0c;边缘计算物联网关在生产场景中的应用越来越广泛。边缘计算物联网关作为连接物理世界与数字世界的桥梁&#xff0c;能够将传感器、执行器等设备产生的海量数据实时传输到云端进行处理&#xff0c;从而实现生产过程的智能化和自动化。 在生…

UE蓝图 返回结果(FunctionResult)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 文章目录 系列文章目录一、FunctionResult节点功能二、FunctionResult节点…

基于ExtendSim的半导体制造工厂仿真

这是一个离散事件模型&#xff0c;使用ExtendeSim “高级资源管理&#xff08;ARM&#xff09;”功能来组织和分配资源。 此模型使用离散事件仿真和高级资源管理&#xff08;ARM&#xff09;功能。ARM是一个集成系统&#xff0c;用于组织资源、区分资源并在整个模型中分配资源。…

C#WinForm窗体TableLayout控件布局

Winform界面TablLayout是常用的控件之一 可以实现界面任意位置布局&#xff0c;在表格中添加其他控件默认只能占用一个单元格&#xff0c;如果想跨任意数量行列需要使用两个函数设置&#xff0c;下面举例 新建Tab表 设置插入按钮布局 // // button1 // this.tableLayoutPanel…

C++模板从入门到入土

1. 泛型编程 如果我们需要实现一个不同类型的交换函数&#xff0c;如果是学的C语言&#xff0c;你要交换哪些类型&#xff0c;不同的类型就需要重新写一个来实现&#xff0c;所以这是很麻烦的&#xff0c;虽然可以cv一下&#xff0c;有了模板就可以减轻负担。 下面写一个适…