首页 > 其他分享 >前端笔记1-vue:状态管理库-Pinia

前端笔记1-vue:状态管理库-Pinia

时间:2024-11-11 19:14:36浏览次数:3  
标签:count vue const storeToRefs counter 笔记 Pinia store

这里写目录标题

前言

Pinia 是一个现代的、类型的 Vuex 替代品,专门为 Vue 3 设计的状态管理库。它提供了一种更简洁、更直观的方式来管理应用的状态。本篇笔记,主要记录vue项目中pinia相关的内容。

链接: 官方文档

一、Pinia 的主要特点

1、类型安全

Pinia 提供了强大的 TypeScript 支持,确保你在开发过程中能够获得更好的类型检查和自动补全。

2、模块化设计

你可以将状态管理拆分为多个 store,每个 store 负责管理一部分状态,使得代码更加模块化和可维护。

3、简洁的API

Pinia 的 API 设计简洁明了,减少了样板代码,使得状态管理更加直观。

4、热重载支持

在开发过程中,Pinia 支持热重载,修改 store 代码后不需要重新启动开发服务器。

5、插件系统

Pinia 提供了插件系统,允许你扩展 store 的功能,例如持久化状态、日志记录等。

二、Pinia的使用

1、基本用法

(1)、安装Pinia

npm install pinia
# 或者
yarn add pinia

(2)、创建Store

store 是一个包含状态(state)、动作(actions)和 getters 的对象。

// src/stores/counter.ts
import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
//存储数据的地方
  state(){
  return{
    	count: 0
    }
  },
  // 存储方法的地方,用于响应组件的动作。
  actions: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    },
  },
  //计算属性
  getters: {
    doubleCount: (state) => state.count * 2,
  },
});

(3)、注册Store

在 Vue 应用中注册 Pinia 并使用 store。在 Vue 应用中注册 Pinia 并使用 store。

// src/main.ts
import { createApp } from 'vue';
import App from './App.vue';
import { createPinia } from 'pinia';

const app = createApp(App);

// 创建 Pinia 实例
const pinia = createPinia();

// 注册 Pinia
app.use(pinia);

// 挂载应用
app.mount('#app');

(4)、在组件中使用Store

<template>
  <div>
    <p>Count: {{ counter.count }}</p>
    <p>Double Count: {{ counter.doubleCount }}</p>
    <button @click="counter.increment">Increment</button>
    <button @click="counter.decrement">Decrement</button>
  </div>
</template>

<script setup>
import { useCounterStore } from './stores/counter';
const counter = useCounterStore();

/*
对于store数据的操作有三种方式:
1、直接操作
counter.count += 1;
2、批量修改
counter.$patch({
	count:2,
});
3、借助action修改
counter.increment();
*/
</script>

2、storeToRefs的使用

storeToRefs 是 Pinia 提供的一个辅助函数,用于将 store 中的响应式状态(state)和计算属性(getters)转换为普通的响应式引用(refs)。
注意:直接解构 store 的状态会导致失去响应式。

// 错误的做法
const { count, doubleCount } = counterStore; // 失去响应式
const { count, doubleCount } = storeToRefs(counterStore); // 保持响应式

使用步骤

import { useCounterStore } from './stores/counter';

//1、引入storeToRefs
import { storeToRefs } from 'pinia';
//2、获取 store 实例
const counterStore = useCounterStore();
//3、使用 storeToRefs 转换状态和计算属性
const { count, doubleCount } = storeToRefs(counterStore);

storeToRefs与toRefs的区别

适用对象:
toRefs:适用于任何响应式对象(通常是通过 reactive 创建的对象)。
storeToRefs:专用于 Pinia store,处理 store 中的状态计算属性

功能范围:
toRefs:只处理响应式对象的属性,不处理方法(actions)。
storeToRefs:处理 Pinia store 的状态和计算属性,不处理方法( actions)。

使用场景:
toRefs:通常用于组件内部,处理组件的响应式数据。
storeToRefs:通常用于组件内部,处理 Pinia store 的状态和计算属性。

3、$subscribe订阅方法

$subscribe 是 Pinia 提供的一个方法,用于订阅 store 的状态变化。通过 $subscribe,你可以在状态发生变化时执行特定的回调函数,这对于实现日志记录、分析或其他需要监听状态变化的场景非常有用。

// src/components/Counter.vue
<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">Increment</button>
    <button @click="decrement">Decrement</button>
  </div>
</template>

<script setup>
import { useCounterStore } from './stores/counter';
import { onMounted, onUnmounted } from 'vue';

const counterStore = useCounterStore();

// 使用 $subscribe 订阅状态变化。state:变化后的数据
  const unsubscribe = counterStore.$subscribe((mutation, state) => {
    console.log('State changed:', state);
    console.log('Mutation:', mutation);
  });

// 直接使用 actions
const { increment, decrement } = counterStore;

// 使用 storeToRefs 将状态和计算属性转换为 refs
const { count, doubleCount } = storeToRefs(counterStore);
</script>

补充:本地化存储数据

//将数据保存到浏览器
localStorage.setItem("key",JSON.stringify(obj));
//为list赋值,若浏览器有缓存数据,则取出并赋值。否则赋值为空数组
list:JSON.parse(localStorage.getItem('key') as string) ||[]
// 删除键为 'username' 的值
localStorage.removeItem('username');
// 清空 Local Storage 中的所有数据
localStorage.clear();

结语

本篇内容主要是记录vue项目中的状态管理库Pinia的相关内容,希望能通过记录,累积知识。

编程是一场思维的马拉松,而不是短跑。相信大家都听过一句话,“种一棵树最好的时间是十年前,其次是现在”,望与诸君共勉

标签:count,vue,const,storeToRefs,counter,笔记,Pinia,store
From: https://blog.csdn.net/weixin_43915285/article/details/143692038

相关文章

  • 【Vue3】知识汇总,附详细定义和源码详解,后续出微信小程序项目(1)
    ====================快速跳转:我的个人博客主页......
  • VUE3 script setup里面如何动态更新整个页面的背景图片
    1.使用内联样式和响应式数据步骤一:创建响应式数据来存储背景图片的URL在scriptsetup中,可以使用ref来创建一个响应式的变量来存储背景图片的URL。<template><div><button@click="changeBackground">更换背景图片</button></div></template><scriptsetup>......
  • vue跨页面调用函数
    1、在utils文件夹下创建中间件middle.js//中间件实现跨页面调用方法importVuefrom'vue'exportdefaultnewVue2、被调用页面代码<template></template><script>importMiddlefrom'@/utils/middle.js';exportdefault{mounted(){let......
  • 《ASP.Net Core技术内幕与项目实战》读书笔记_1
    ch1.NETCore入门.NET介绍这一章主要说的是.NetCore、.NetFramework、.NetStanard三个之间的关系。通俗来讲就是Core是新出的、能跨平台,Framwork是老版的、不能跨平台,Standard是为了在Framework、Core、Xamarin中统一库的使用而定制的规范,以便于开发出来的库可以在多个平......
  • vue3 provide的值 在回调函数中改变,inject 如何获取到最新的值?
    需求:父组件,通过provide传递了视频方向的响应式值,该值会有一个初始化的默认值,并在获取视频方向的回调函数中,来动态改变子组件,需要获取到父组件传递的视频方向,来执行一些逻辑。这里我们在子组件中通过父组件传递响应式的变量,子组件接受后,通过watch监听该变量的改变,来动态执......
  • 「笔记」可撤销背包
    目录写在前面引入分析代码例题AtCoderABC321FCF1111DCCPC2024HarbinE写在最后写在前面vp24harbin时E前面的一切全都会了就是不会撤销背包,以为要上多项式科技于是跑路了,vp快结束了跟坐牢计算几何的dztlb大神一说他说他会呃呃,完蛋。引入P4141消失之物:给定\(n\)......
  • [豪の学习笔记] CI/CD相关 - Docker
    一、docker常见命令单独下载镜像文件dockerpull查看本地镜像文件dockerimages删除本地镜像文件dockerrmi基于dockerfile构建自定义镜像dockerbuild将打包好的镜像保存在本地dockersave加载外部镜像文件dockerload将本地镜像推送到镜像仓库dockerpush创建并......
  • Spring学习笔记_30——事务接口PlatformTransactionManager
    PlatformTransactionManager是Spring框架中事务管理的核心接口,它负责管理事务的创建、提交和回滚等操作。源码/**Copyright2002-2020theoriginalauthororauthors.**LicensedundertheApacheLicense,Version2.0(the"License");*youmaynotusethis......
  • [豪の学习笔记] Git的使用
    一、本地仓库1.1-工作流程1.2-本地仓库操作①全局配置:gitconfig--globaluser.name"用户名"gitconfig--globaluser.email"邮箱地址"②创建仓库:当需要让Git去管理某个项目时,就需要创建仓库。PS:创建仓库时使用的目录不一定要求是空目录,选择一个非空目录也可以......
  • MapStruct笔记
    依赖包<dependency><groupId>org.mapstruct</groupId><!--jdk8以下就使用mapstruct--><artifactId>mapstruct-jdk8</artifactId><version>1.2.0.Final</version></dependency><dependency>......