• 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实例并将其传递给应用

    1. //src/main.js
    2. //创建应用实例
    3. import { createApp } from "vue";
    4. import App from "./App.vue";
    5. let app = createApp(App);
    6. //pinia实例
    7. import { createPinia } from "pinia";
    8. let pinia = createPinia();
    9. app.use(pinia);
    10. app.mount("#app");

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

    3、定义Store

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

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

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

    1. import { defineStore } from "pinia";
    2. import { reactive, computed } from "vue";
    3. import type { City, Province } from "@/interface/common";
    4. export const useMapStore = defineStore("mapStore", () => {
    5. //state
    6. let cityList = reactive<Array<City>>([]);
    7. let provinceList = reactive([]);
    8. //getter
    9. const simpleCityList = computed(() => {
    10. return cityList.filter((item) => item.code != "110000");
    11. });
    12. //actions
    13. function changeCityList(list: City[]) {
    14. console.log("修改城市列表数据的事件被触发");
    15. cityList = Object.assign(cityList, list);
    16. }
    17. function changeProviceList(list: Province[]) {
    18. console.log("修改省份列表数据的事件被触发");
    19. provinceList = Object.assign(provinceList, list);
    20. }
    21. return {
    22. cityList,
    23. provinceList,
    24. simpleCityList,
    25. changeCityList,
    26. changeProviceList,
    27. };
    28. });

     

    4、使用store

    1. <script setup lang='ts' name='Login'>
    2. import { onMounted} from 'vue';
    3. import { storeToRefs } from 'pinia';
    4. import { getCityList } from "@/utils/common";
    5. import { useMapStore } from '@/stores/map'
    6. let mapStore = useMapStore()
    7. let { cityList } = storeToRefs(mapStore) //为了从 store 中提取属性时保持其响应性,需要使用 storeToRefs()。它将为每一个响应式属性创建引用
    8. onMounted(async () => {
    9. let list = await getCityList()
    10. mapStore.changeCityList(list) //修改store里的属性数据
    11. })
    12. script>
    13. <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 的补丁对象在同一时间更改多个属性

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

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

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

  • 相关阅读:
    Selenium工作原理详解
    [附源码]SSM计算机毕业设计 图书管理系统 JAVA
    JS导出文本为文本文件
    项目管理:如何建立一个具有执行力的团队?
    前端导出word文件的多种方式、前端导出excel文件
    CHRONY - 时钟同步
    口感鲜美的健康饮品,随时补充营养恢复活力,厘盏蛋白银耳燕窝体验
    用于大规模 MIMO 检测的近似消息传递 (AMP)(Matlab代码实现)
    在Linux中对Nginx配置rewrite跳转
    小球无规则移动(动画参数AnimationParameters)
  • 原文地址:https://blog.csdn.net/weixin_40297452/article/details/136210296