前端状态管理之Piana

状态管理:集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化

当项目中有多个组件共享某些状态的时候,使用父子组件传值或是组件间传值会非常麻烦,并且数据不易维护。除了在项目中定义全局变量,还可以使用状态管理库来进行共享状态管理,使数据持久化。

PianaVuex 都是 Vue 的状态管理库,可以跨组件或者页面共享状态。现在很多项目都是Vue3+Vite+Pinia 的配置,选择 Pinia ,因为它更加轻量、相比之下更容易理解和使用,比较灵活,同时支持 Vue2 和 Vue3

Vuex :支持 stategettersactionsmutations,而 Piana 不再使用 mutations。 Piana 在线 demo

安装及引入

安装:

less 复制代码
npm i vuex -S  // vuex
npm install pinia // piana

引入:在 main.js 文件中挂载 Pinia 实例

javascript 复制代码
import { createPinia } from 'pinia'
createApp(App).use(createPinia()).mount('#app')

定义 store

这里以登录之后存储接口返回的用户信息为例:

  1. 在 src 目录下新建 store/user/index.js 文件

目录结构:

  • src
  • store

    • user

      • index.js
  1. 创建Store

Piana 支持使用两种语法创建 Store:

  • 选项式API (Options API)
  • 组合式API(Composition API),贴近Vue3的语法,组合式的写法让代码更加扁平化

从 pinia 中引入 defineStore ,通过 defineStore 声明对应的数据和方法,共两个参数:

  • id,第一个参数是一个唯一的名称(唯一的标识),也就是为容器起一个名字
  • 第二个参数:函数或对象
  • 返回值:一个函数

第二个参数,包含三个属性:

  • state: 表示状态, state 是一个函数, 需要持共享的数据在函数的返回值中声明
  • getters: 计算属性
  • actions: 修改状态(state)的方法,修改数据时,需要通过调用函数传递参数来修改变量的值,不能直接对变量赋值。

比如存储用户名称,在 actions 中定义 setUserName() 方法来实现,使用对象类型的代码如下:

javascript 复制代码
import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
  state: () => {
    return {
      userName: "",
    }
  },
  getters:{},
  actions:{
      setUserName(val) { this.userName = val }
  }
})

使用函数类型的代码如下:

js 复制代码
import { defineStore } from 'pinia';
import { ref } from 'vue';

export const useNameStore = defineStore('user', () => {
  const userName = ref('');
  function setUserName(val) {
    userName.value = val;
  }
  return { 
    userName,
    setUserName
  }
});

使用数据

  1. 引入对应的 store 文件比如这里需要使用用户信息

import { useNameStore } from '../store/user/index'

  1. 定义 store

const store = useNameStore();

  1. 在 script 中使用 actions 中声明的 setUserName 函数:
js 复制代码
const doSomething =() { store.setUserName("admin"); }
  1. 在 template 中使用state 属性定义的变量 userName:{{store.userName}}

4.解构的数据

解构的数据,并不是响应式数据,数据变化时,这类数据不会随之更新,导入 Piana 的 storeToRefs方法,数据变成响应式。 const { a, b } = storeToRefs(store)

数据持久化

需要注意的是,pinia 与 vuex 都是将数据存在内存中,vuex 在刷新浏览器页面后会清理内存,会有数据丢失的问题,pinia 也会有同样的问题。

如何使数据持久化

  • 浏览器缓存:cookielocalStoragesessionStorage

  • 插件 (插件的原理也是将数据通过 localStorage 进行缓存)

    • Pinia-persistedstate-plugin
    • vuex-persistedstate
相关推荐
xw530 分钟前
npm几个实用命令
前端·npm
!win !34 分钟前
npm几个实用命令
前端·npm
代码狂想家39 分钟前
使用openEuler从零构建用户管理系统Web应用平台
前端
dorisrv2 小时前
优雅的React表单状态管理
前端
蓝瑟2 小时前
告别重复造轮子!业务组件多场景复用实战指南
前端·javascript·设计模式
dorisrv3 小时前
高性能的懒加载与无限滚动实现
前端
韭菜炒大葱3 小时前
别等了!用 Vue 3 让 AI 边想边说,字字蹦到你脸上
前端·vue.js·aigc
StarkCoder3 小时前
求求你,别在 Swift 协程开头写 guard let self = self 了!
前端
清妍_3 小时前
一文详解 Taro / 小程序 IntersectionObserver 参数
前端
电商API大数据接口开发Cris3 小时前
构建异步任务队列:高效批量化获取淘宝关键词搜索结果的实践
前端·数据挖掘·api