前端状态管理之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
相关推荐
好家伙VCC35 分钟前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务1 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整1 小时前
面试点(网络层面)
前端·网络
VT.馒头2 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy2 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron07073 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js
css趣多多4 小时前
地图快速上手
前端
zhengfei6114 小时前
面向攻击性安全专业人员的一体化浏览器扩展程序[特殊字符]
前端·chrome·safari
码丁_1174 小时前
为什么前端需要做优化?
前端
Mr Xu_4 小时前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构