avatar

麦兜的小站

MDO.INK

  • 首页
  • 随笔
  • 知识库
  • 归档
  • 动态
  • 标签
  • 关于
Home pinia使用指南Pinia 是 Vue 新一代的状态管理器
文章

pinia使用指南Pinia 是 Vue 新一代的状态管理器

Posted 2025-02-10 Updated 2025-02- 10
By power 已删除用户
11~14 min read

前言

什么是pinia

Pinia 是 Vue 新一代的状态管理器。同时适用于 Vue 2 和 Vue 3。在vue3中有人可能会使用export const state = reactive({})来共享全局状态. 但是这样在SPA页面中还行,在SSR应用中则会出现 安全漏洞

pinia的特点

  • 支持options api 和 composition api
  • 去除 mutations 比vuex更加精简
  • 在页面或者组件直接引用后使用, 数据来源更加清晰调试更加方便
  • 全面的TypeScript支持
  • 服务器端渲染支持
  • 轻量 压缩后的体积只有1kb左右

下载

npm install pinia --save

yarn add pinia

使用

import { createPinia } from 'pinia'
app.use(createPinia())
  • 定义state 和 getters

    import { defineStore } from 'pinia'
    export const PublicStore = defineStore('Public', { 
        state: () => {
            return {
                userMsg: {},
            }
        },
        getters: {
            getUserMsg: (state) => {
                return state.userMsg
            },
        },
    
    })
    
  • 访问state 和 getters 两者的使用非常相似

    • 在Composition API中```js import { PublicStore } from '@/store/Public' const store = PublicStore() console.log(store.getUserMsg.userName, store.userMsg.token) const { getUserMsg, userMsg } = { …PublicStore() } console.log(getUserMsg.userName, userMsg.token)

      ```

    • state直接解构会使其失去响应式,这时候可以用 pinia 的 `storeToRefs````js import { PublicStore } from '@/store/Public' import { storeToRefs } from 'pinia' const { getUserMsg, userMsg } = storeToRefs(PublicStore()) console.log(getUserMsg.value.userName, userMsg.value.token)

      ```

    • 在Option API中 需要使用辅助函数 `mapState````js import { PublicStore } from '@/store/Public' import { mapState } from 'pinia' export default { name: 'Home', computed: { …mapState(PublicStore, ['getUserMsg', 'userMsg']), …mapState(PublicStore, { aliasUserMsg: 'userMsg', aliasGetUserMsg: 'getUserMsg', userName: store => store.userMsg.userName + store.getUserMsg.token, getTooken(store) { return [store.getUserMsg, store.userMsg, this.getUserMsg] } }), } };

      ```

  • 定义actions

    import { defineStore } from 'pinia'
    import { Auth } from './auth' 
    export const PublicStore = defineStore('Public', {
    
       actions: {
           setUserMsg(userMsg) {
               this.userMsg = userMsg
           },
           async setUserMsgToken(userMsg) { 
               const authStore = Auth()
               let res = await authStore.setPower() 
               if (res) {
                   userMsg.authList = authStore.power
                   this.userMsg = userMsg
                   return true
               } else {
                   return false
               }
           }
       }
    })
    
    import { defineStore } from 'pinia'
    import api from '@/api'
    export const Auth = defineStore('Auth', {
        state: () => {
            return {
                power: [],
            }
        },
    actions: {
        async setPower() {
            let res = await api.BaseApi.getPower() 
            if (res.code === 200) {
                this.power = res.data
                return true
            }
        }
    }
    
    })
  • 使用actions

    • 在Composition API中

      import { PublicStore } from '@/store/Public'
      const store = PublicStore()
      const update = async () => {
      let power = await store.setUserMsgToken({ userName: '涵涵',token: '234523423423423',authList: [] })
      if (power) {
      
      } else {
      
      }
      
      }
    • 在Option API中 使用mapActions辅助函数

      import { PublicStore } from '@/store/Public'
      import {  mapActions } from 'pinia'
      export default {
          name: 'Home',
          methods: {
              ...mapActions(PublicStore, ['setUserMsg']),
              ...mapActions(PublicStore, {
                  setUserMsgToken: 'setUserMsgToken'
              }),
              async update() {
              let power = await this.setUserMsgToken({userName: '憨憨',token: '54735634545',authList: [] })
              if (power) {
          } else {
      
          }
      },
      
      }
      };
  • 重置数据 reset

    import { PublicStore } from '@/store/Public' 
    const store = PublicStore()
    store.$reset()
    
    
    import { PublicStore } from '@/store/Public'
    export default {
        methods: {
            reset() {
                const store = PublicStore() 
                store.$reset() 
            }
        }
    };
    
前端
License:  CC BY 4.0
Share

Further Reading

Jun 25, 2025

Vue实现顶部导航跟随页面联动效果

需求背景 最近也是应我一位同学的要求,给他的公司制作一个官网,那也就是拾起了一些基础的知识,搜索了一些其它的文章有实现这种效果的,但大多导航都是在侧边,然后点击导航对应的部分内容滑到最上面,跟我这次设...

Jun 20, 2025

Share.js - 一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点

一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点等社交网站,使用字体图标。 有两种安装方式: 使用npm npmi...

Jun 19, 2025

node express实现热更新

在使用node进行开发的时候,每次修改文件,都需要重启express服务很麻烦 我们可以使用nodemon这个库,修改文件后可以自动重启express服务。 安装: npminstall--save-...

OLDER

pinia优雅的持久化数据

NEWER

Git Commit 规范

Recently Updated

  • 如何实现接口幂等性
  • 10个npm工具包
  • How to set up PHP7.4 on MacOS.
  • Automa:一键自动化,网页数据采集与工作流程优化专家Automa:解锁自动化
  • Mac 下用 brew 搭建 LNMP

Trending Tags

thinkphp clippings

Contents

©2025 麦兜的小站. Some rights reserved.

Using the Halo theme Chirpy