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')
相关推荐
负责的蛋挞38 分钟前
异步HttpModule的实现方式
java·服务器·前端
丹宇码农3 小时前
把 HLS 字幕玩出花:zwPlayer 如何让 M3U8 视频支持全文搜索、翻译与码率自适应
前端·javascript·音视频·hls·视频播放器
2501_943782353 小时前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq4 小时前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品4 小时前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
微信开发api-视频号协议4 小时前
企业微信二次开发中的文件系统设计:媒体资源、临时文件与业务附件
前端·微信·企业微信·媒体·ipad·微信开放平台
柒和远方4 小时前
Phase 7.4 学习博客:为什么多 API 项目需要 Swagger / OpenAPI
前端·后端·架构
张龙6874 小时前
拼多多开放平台对接踩坑实录:从 CLIENT_ID 配置到 MD5 签名算法的完整填坑指南
前端
GuWenyue4 小时前
提示词彻底过时?一套上下文工程方案,3步让LLM落地生产,代码直接复用
前端·javascript·人工智能