从零搭建基于element-plus的Vue3项目03——Pinia状态管理

Pinia状态管理

目前Vuex已经不推荐使用,4.x是最后一版,已经不会有新版本,Pinia实际就是Vuex 5,因此推荐使用Pinia作为状态管理,其实Pinia使用比Vuex要简单。实际已经在生成项目的时候已经是集成了Pinia

地址:https://pinia.vuejs.org/zh/introduction.html

Pinia简单对比Vuex

这里简单对比一下PiniaVuex,实现的功能都一样,就是全局的状态数据共享,Pinia简化了以前使用Vuex的一些重复的多余的步骤,简化状态管理

对比项目 Pinia Vuex
state state简单数据可以直接修改(也不推荐) 不推荐直接修改state,需要用mutation或者action修改
getters 支持 支持
mutations 废弃 支持,更新数据必需
actions 推荐用action修改数据 支持,更新数据必需
持久化 pinia-plugin-persistedstate vuex-persistedstate
modules模块 多store文件,按需import 支持多模块:Mudule1/gettter1,但是需要拼接名称,较为繁琐
devtools 支持 支持

安装使用

import { createPinia } from 'pinia'
import App from '@/App.vue'

const app = createApp(App)
const pinia = createPinia()
app.use(pinia)

Pinia基本使用

Pinia支持选项式API和组合式API,因为Vue3通常都是用组合式API,因此使用Pinia的时候也考虑用组合式API

Store定义

组合式API相对简单:

  • ref() 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions
import { ref } from 'vue'
import { defineStore } from 'pinia'
import { GlobalLayoutMode, GlobalLocales } from '@/consts/GlobalConstants'
import { changeMessages } from '@/messages'

export const useGlobalConfigStore = defineStore('globalConfig', () => {
  const currentLocale = ref(GlobalLocales.CN)
  const layoutMode = ref(GlobalLayoutMode.LEFT)
  return {
    currentLocale,
    layoutMode,
    changeLocale (locale) {
      if (Object.values(GlobalLocales).includes(locale)) {
        currentLocale.value = locale
      } else {
        throw new Error(`Locale ${locale} is not supported.`)
      }
      changeMessages(locale)
    },
    changeLayout (layout) {
      if (Object.values(GlobalLayoutMode).includes(layout)) {
        layoutMode.value = layout
      } else {
        throw new Error(`Layout ${layout} is not supported.`)
      }
    }
  }
})

Store使用

Vue组件中使用比较简单,直接import 并结构出store的定义方法,然后就可以直接使用里面的stateaction方法

<script setup>
import { useGlobalConfigStore } from '@/stores/GlobalConfigStore'
import { $changeLocale, elementLocale, $i18nBundle } from '@/messages'

const globalConfigStore = useGlobalConfigStore()
$changeLocale(globalConfigStore.currentLocale)
</script>

<template>
  <el-config-provider :locale="elementLocale.localeData">
    <router-view />
  </el-config-provider>
</template>

<style scoped>
</style>

集成持久化

通常情况下我们还会把一些状态存储到localStorage,不然刷新页面或者再次进入页面就会丢失状态,比如主题样式,语言、登录信息等

安装插件:npm i pinia-plugin-persistedstate

// 注册插件
import { createPinia } from 'pinia'
import App from '@/App.vue'
import piniaPluginPersistedState from 'pinia-plugin-persistedstate'

const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPluginPersistedState)
app.use(pinia)

然后在定义store的时候加上:

{
  persist: true
}

最终开源地址:

https://github.com/fugary/simple-element-plus-template

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇