Advertisement

【vue3】使用pinia替代vuex

阅读量:

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

1. 安装

复制代码
    npm i pinia --save
    
    
      
    
    代码解释

2. pinia特点

  1. 完全支持typescript语言的功能实现
  2. 经过优化的轻量化处理后文件大小仅为1.6kb
  3. 系统完全去除mutation相关功能仅保留state存储结构以及getters和actions操作接口
  4. 支持同时进行同步操作与异步操作以提高系统的响应效率
  5. 不采用模块化设计仅通过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会自动根据文件区分模块
!\( 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中存储的键值等于store模块的ID值。通过strategies可以调整键值以及存储位置,请问您是希望将键名更改为'_user'并将其存储于localStorage中吗?请注意,在此操作前sessionStorage中仍存留着旧数据,请您确认是否需要清除现有数据以避免冲突

复制代码
    persist: {
    enabled: true,
    strategies: [{
      key: '_user',
      storage: localStorage
    }]
      }
    
    
      
      
      
      
      
      
      
    
    代码解释

在控制台打印localStorage

在这里插入图片描述
(3) 自定义要持久化的字段

默认情况下,在库中所有的字段都会被缓存。通过指定paths参数可以选择性地选择需要缓存的字段。例如,在实际操作中

复制代码
      persist: {
    enabled: true,
    strategies: [{
      key: '_user',
      storage: localStorage,
      paths: ['userInfo']
    }]
      }
    
    
      
      
      
      
      
      
      
      
    
    代码解释

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

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~