vue3使用pinia替代vuex举例

描述业务场景:

vue3项目中有一个业务场景

Task1View.vue

Task2View.vue

路由

{

path: "/task1/:userId?",

name: "task1",

component: Task1View,

},

{

path: "/task2/:userId?",

name: "task2",

component: Task2View,

},

无论是task1还是task2访问的时候都要获取到userId,并且根据userId做一些查询,查询结果返回username显示在task1和task2中.请问该怎么写代码?

处理过程:

使用路由守卫:

复制代码
// stores/userStore.js
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('user', () => {
  const username = ref('')
  const loading = ref(false)

  const fetchUserInfo = async (userId) => {
    if (!userId) return
    
    loading.value = true
    try {
      const response = await fetch(`/api/users/${userId}`)
      const data = await response.json()
      username.value = data.username
    } catch (error) {
      console.error('Failed to fetch user info:', error)
    } finally {
      loading.value = false
    }
  }

  return {
    username,
    loading,
    fetchUserInfo
  }
})

路由守卫中处理:

复制代码
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/userStore'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: "/task1/:userId?",
      name: "task1",
      component: () => import('@/views/Task1View.vue'),
    },
    {
      path: "/task2/:userId?",
      name: "task2",
      component: () => import('@/views/Task2View.vue'),
    },
  ]
})

// 全局前置守卫
router.beforeEach(async (to, from) => {
  // 检查是否是需要用户信息的页面
  if (to.name === 'task1' || to.name === 'task2') {
    const userId = to.params.userId
    if (userId) {
      const userStore = useUserStore()
      await userStore.fetchUserInfo(userId)
    }
  }
})

export default router

组件中的使用:

复制代码
<!-- Task1View.vue -->
<template>
  <div>
    <div v-if="userStore.loading">Loading...</div>
    <div v-else>
      <h1>Task 1 - User: {{ userStore.username || 'No user selected' }}</h1>
      <!-- 其他内容 -->
    </div>
  </div>
</template>

<script setup>
import { useUserStore } from '@/stores/userStore'

const userStore = useUserStore()
</script>

什么是 Pinia?

1. 官方推荐的状态管理库

  • Vue 官方团队开发和维护

  • 类型安全,完美支持 TypeScript

  • API 设计简单直观

安装pinia:

复制代码
npm install pinia
# 或
yarn add pinia

vue中使用pinia:

复制代码
// main.js
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

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

app.use(pinia)
app.mount('#app')
相关推荐
0思必得06 分钟前
[Web自动化] 反爬虫
前端·爬虫·python·selenium·自动化
LawrenceLan16 分钟前
Flutter 零基础入门(二十六):StatefulWidget 与状态更新 setState
开发语言·前端·flutter·dart
秋秋小事36 分钟前
TypeScript 模版字面量与类型操作
前端·typescript
2401_892000521 小时前
Flutter for OpenHarmony 猫咪管家App实战 - 添加提醒实现
前端·javascript·flutter
Yolanda941 小时前
【项目经验】vue h5移动端禁止缩放
前端·javascript·vue.js
VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue酒店管理系统(源码+数据库+文档)
vue.js·spring boot·课程设计
广州华水科技2 小时前
单北斗GNSS形变监测一体机在基础设施安全中的应用与技术优势
前端
EndingCoder3 小时前
案例研究:从 JavaScript 迁移到 TypeScript
开发语言·前端·javascript·性能优化·typescript
Irene19913 小时前
Vue3 中使用的命名规则 和 实际开发命名规范总结
vue.js·命名规范
阿珊和她的猫4 小时前
React 路由:构建单页面应用的导航系统
前端·react.js·状态模式