vue3 学习笔记06 -- pinia的简单使用

vue3 学习笔记06 – pinia的简单使用

使用 Pinia 的步骤可以分为安装和配置 Pinia、创建和封装 store 以及在组件中使用 store。

安装依赖
npm install pinia@next
引入
  1. 在main.ts中直接引入pinia
import { createApp } from 'vue'
import { createPinia } from 'pinia'
const app = createApp(App)
app.use(createPinia())
app.mount('#app')
  1. 单独开个 .ts 文件引入pinia,在main.ts中引入
import { createApp } from 'vue'
import { setupStore } from "@/stores";
const app = createApp(App)
setupStore(app);
app.mount('#app')
创建和配置 Pinia Store
  • 在 src 目录下创建一个 stores 文件夹,并在其中创建 Pinia 的 store。
    • 创建一个 src/stores/index.ts
       import type { App } from 'vue'
      import { createPinia } from 'pinia'
      
      const store = createPinia()
      
      // 全局注册 store
      export function setupStore(app: App<Element>) {
        app.use(store)
      }
      
      export { store }
      
      
      
    • 创建一个 src/stores/user.ts
          import { defineStore } from 'pinia'
          import { getUserInfo } from '@/api/user/user'
          import { store } from './index'
      
          export const useUserStore = defineStore('user', () => {
              const user = {
                  token: '',
                  userId: '',
                  info: {}
              }
              function setToken(token: string) {
                  user.token = token
              }
              function setUserId(id: number | string) {
                  user.userId = id
              }
              function setInfo(info: object) {
                  user.info = info
              }
              function handleGetUserInfo() {
                  return new Promise((resolve, reject) => {
                      // 登录时存在session中的用户信息
                  let { userId } = sessionStorage.userInfo ? JSON.parse(sessionStorage.userInfo) : {}
                  getUserInfo({ id: userId })
                      .then((res) => {
                          let data = res || {}
                          user.info = data
                          // 获取到用户权限及详细信息
                          resolve()
                      })
                      .catch((error) => {
                          console.log(error, 'error')
                          reject(error)
                      })
                  })
              }
              
              return { user, handleGetUserInfo,setToken, setUserId, setInfo }
          })
          export function useUserStoreHook() {
            return useUserStore(store)
          }
      
在组件中使用 Pinia Store
<template>
 form表单.....
<el-button class="login-button" type="primary" @click="handleLogin" :loading="loading"
        >登录</el-button
      >
</template> 
<script setup lang="ts">
import { login } from '@/api/login/login'
import { useRouter } from 'vue-router'
import { useUserStoreHook } from '@/stores/user'
let loading = ref(false)
const router = useRouter()
const userStore = useUserStoreHook()
const handleLogin = ()=>{
    let data = {
        username:'xxx',
        password:'xxx'
    }
    // 存储toekn及id到store中
    userStore.setToken(token)
    userStore.setUserId(userId)
    loading.value = true
    login(data).then((res)=>{
        loading.value = false
        // 一些存储token及其他信息的处理的处理
        ....要干的事
        router.push('/')
    })
}
</script>  
在导航守卫中使用
  • src/permission/index.ts
import router from '@/router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStoreHook } from '@/stores/user'
const whiteList = ['/login']
const userStore = useUserStoreHook()
NProgress.configure({ showSpinner: false }) // 进度条
router.beforeEach(async (to, form, next) => {
  NProgress.start()
  // 判断是否有token
  if (userStore.user.token) {
    if (to.path == '/login') {
      next()
      NProgress.done()
    } else {
        try{
            next()
            NProgress.done()
        } catch (error) {
          next(`/login`)
          NProgress.done()
        }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
      NProgress.done()
    } else {
      next(`/login`)
      NProgress.done()
    }
  }
})

相关推荐

  1. vue3 学习笔记06 -- pinia简单使用

    2024-07-13 07:06:02       28 阅读
  2. vue3 学习笔记04 -- axios使用及封装

    2024-07-13 07:06:02       23 阅读
  3. Vue3Pinia状态管理库学习笔记

    2024-07-13 07:06:02       39 阅读
  4. Vue3】状态管理工具——pinia使用

    2024-07-13 07:06:02       68 阅读
  5. vue3+vite+js 使用pinia -- vue2 vuexplus版

    2024-07-13 07:06:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 07:06:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 07:06:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 07:06:02       57 阅读
  4. Python语言-面向对象

    2024-07-13 07:06:02       68 阅读

热门阅读

  1. C# Winform 自定义事件实战

    2024-07-13 07:06:02       22 阅读
  2. Linux RTL8111/8168/8411 不能联网

    2024-07-13 07:06:02       23 阅读
  3. 图论基础概念(详细讲解)

    2024-07-13 07:06:02       23 阅读
  4. ARFoundation系列讲解 - 94 Immersal 简介

    2024-07-13 07:06:02       23 阅读
  5. Knife4j的原理及应用详解(一)

    2024-07-13 07:06:02       22 阅读
  6. Linux Vim基础教程

    2024-07-13 07:06:02       24 阅读
  7. 在Qt C++项目中调用7z API实现压缩和解压

    2024-07-13 07:06:02       16 阅读
  8. 详解C#委托与事件

    2024-07-13 07:06:02       27 阅读
  9. 在Spring Boot项目中集成监控与报警

    2024-07-13 07:06:02       27 阅读
  10. 第二讲 数据结构

    2024-07-13 07:06:02       21 阅读
  11. 11网络层-分组转发算法

    2024-07-13 07:06:02       27 阅读
  12. MySQL与Redis优化

    2024-07-13 07:06:02       24 阅读
  13. C++中的RTTI(运行时类型识别)的定义

    2024-07-13 07:06:02       26 阅读