vue3如何用pinia替代vuex

 更新时间:2024年03月09日 09:01:01   作者:sqwu  
这篇文章主要介绍了vue3如何使用pinia替代vuex问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

pinia是vue团队推荐代替vuex的一款轻量级状态管理库。

1. 安装

npm i pinia --save

2. pinia特点

  • 完整的typescript支持
  • 足够轻量,压缩后的体积只有1.6kb
  • 去除mutations,只保留state,getters,actions
  • actions同时支持同步和异步
  • 没有modules模块的概念,只有store,store之间可以互相引用,更好的代码分割

3. 使用

1.初始化store

创建目录store/index.ts

import { createPinia } from 'pinia'

const store = createPinia()

export default store

2.在main.ts引用store

import { createApp } from 'vue'
import App from './App.vue'
import store from './store'

const app = createApp(App)

app.use(store)
app.mount('#app')

3.创建store

根据功能模块在store下创建ts文件,维护各个功能的数据,如用户模块user.ts,维护两个字段:userInfo和token,通过actions里面的方法修改userInfo和token的内容

import { defineStore } from 'pinia'

interface UserInfo {
  name?: string
  age?: number
}

// 第一个参数是id,id必填,且需要保证值唯一
export const useUserStore = defineStore('user', {
  state: (): {
    userInfo: UserInfo
    token: string
  } => {
    return {
      userInfo: {},
      token: ''
    }
  },
  getters: {
    newName: state => state.userInfo.name + '牛'
  },
  actions: {
    updateUserInfo(userInfo: UserInfo) {
      this.userInfo = userInfo
    },
    updateToken(token: string) {
      this.token = token
    }
  }
})

4.读取数据

引入要读取的store

<script setup lang="ts">
import { useUserStore } from '../../store/user'

const userStore = useUserStore()

// 读取state中的数据
const userInfo: ComputedRef<{
  name?: string
  age?: number
}> = computed(() => userStore.userInfo)

// 读取getter中的数据
const newName = userStore.newName
</script>

5.修改数据

<script lang="ts" setup>
import { useUserStore } from '../../store/user'

const userStore = useUserStore()

function handleLogin() {
  userStore.updateUserInfo({ name: '李二' })
}
</script>

6.store的相互引用

不同store之间引用,举个🌰:创建user2.ts,引用user.ts的数据

import { defineStore } from 'pinia'
import { useUserStore } from './user'

export const useUser2Store = defineStore('user2', {
  state: (): {
    sex: string
  } => {
    return {
      sex: '0'
    }
  },
  actions: {
    sayInfo(sex: string) {
      this.sex = sex
  
      // 引用其他store
      const userStore = useUserStore()
      console.log(
        `我叫${userStore.newName}, 我是个小${
          this.sex === '0' ? '姑娘' : '伙子'
        }`
      )
    }
  }
})

在组件中使用user2模块

<script lang="ts" setup>
import { useUser2Store } from '../../store/user2'

const user2Store = useUser2Store()

setTimeout(() => {
  user2Store.sayInfo('1')
}, 3000) // 3s后输出----》 我叫李二牛, 我是个小伙子
</script>

7.devtools

在devtools中可以看到,pinia会自动根据文件区分模块!

[image.png](https://img-blog.csdnimg.cn/img_convert/cc84658cff008f5a4f12cd055b0d3e63.png#clientId=ub02bfd39-d58d-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=334&id=ua2094b26&margin=[object Object]&name=image.png&originHeight=334&originWidth=854&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28525&status=done&style=none&taskId=u68d66ff1-1cbd-4188-883d-42b4edf1940&title=&width=854

4.数据持久化

开启持久化可以在页面刷新的时候,帮我们把数据缓存下来,不被清空。

1.安装插件

npm i pinia-plugin-persist --save

2.引用插件

在store/index.ts引入插件,并且use

import { createPinia } from 'pinia'
import piniaPluginpersist from 'pinia-plugin-persist'

const store = createPinia()

// 使用持久化插件
store.use(piniaPluginpersist)

export default store

3.在store模块中启用持久化

(1) 启用

在user.ts中启用:添加persist配置项

import { defineStore } from 'pinia'
export const useUserStore = defineStore('user', {
  state: (): {
    userInfo: UserInfo
    token: string
  } => ({
    userInfo: {},
    token: ''
  }),
  getters: { ... },
  actions: { ... },
    
  // 开始数据持久化
  persist: {
    enabled: true
  }
})

数据会默认存储到sessionStorage,可以在控制台看到。

(2) 修改key & 存储位置

默认存储到sessionStorage的key值就是store模块id值。可以通过strategies修改key值和存储位置,如:

将key值改为_user,存储位置改为localStorage(注意之前缓存在sessionStorage中的数据还在,可以手动清除一下sessionStorage.clear())

persist: {
    enabled: true,
    strategies: [{
      key: '_user',
      storage: localStorage
    }]
  }

在控制台打印localStorage

(3) 自定义要持久化的字段

默认会将store中的所有字段都缓存,可以通过paths指定要缓存的字段。

如:我只要缓存userInfo

  persist: {
    enabled: true,
    strategies: [{
      key: '_user',
      storage: localStorage,
      paths: ['userInfo']
    }]
  }

控制台打印,可以看到token字段没有了!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 利用Vue与D3.js创建交互式数据可视化

    利用Vue与D3.js创建交互式数据可视化

    在现代Web开发中,数据可视化是一个引人瞩目的热点领域,从简单的图表到复杂的交互式仪表盘,数据可视化能够帮助用户更好地理解数据,而Vue与D3.js的结合则为我们提供了构建这些可视化效果的强大工具,本文将向您展示如何利用Vue与D3.js创建一个基本的交互式数据可视化项目
    2025-02-02
  • .netcore+vue 实现压缩文件下载功能

    .netcore+vue 实现压缩文件下载功能

    这篇文章主要介绍了.netcore+vue 实现压缩文件下载功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 从源码角度带你深入理解Vue依赖收集的核心

    从源码角度带你深入理解Vue依赖收集的核心

    在 Vue 的响应式系统中,依赖收集是贯穿整个数据驱动视图的核心环节,本文将从 Vue 2 的源码出发,层层拆解依赖收集的完整流程,带你从 “使用层” 走向 “原理层”,真正理解 Vue 响应式的底层逻辑
    2026-03-03
  • VUE 实现element upload上传图片到阿里云

    VUE 实现element upload上传图片到阿里云

    这篇文章主要介绍了VUE 实现element upload上传图片到阿里云,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 浅谈vue项目打包优化策略

    浅谈vue项目打包优化策略

    这篇文章主要介绍了浅谈vue项目打包优化策略,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Vue中@click事件的常见修饰符用法总结

    Vue中@click事件的常见修饰符用法总结

    这篇文章主要给大家介绍了关于Vue中@click事件的常见修饰符用法的相关资料,@click事件修饰符是在Vue组件中用来修改@click事件行为的特殊标记,需要的朋友可以参考下
    2023-10-10
  • vue恢复初始数据this.$data,this.$options.data()解析

    vue恢复初始数据this.$data,this.$options.data()解析

    这篇文章主要介绍了vue恢复初始数据this.$data,this.$options.data()解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 浅谈vue的iview列表table render函数设置DOM属性值的方法

    浅谈vue的iview列表table render函数设置DOM属性值的方法

    下面小编就为大家带来一篇浅谈vue的iview列表table render函数设置DOM属性值的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • vue实现固定位置显示功能

    vue实现固定位置显示功能

    这篇文章主要介绍了vue实现固定位置显示功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • 在vscode 中设置 vue模板内容的方法

    在vscode 中设置 vue模板内容的方法

    这篇文章主要介绍了在vscode 中设置 vue模板内容的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论