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')
相关推荐
子兮曰2 小时前
OpenClaw入门:从零开始搭建你的私有化AI助手
前端·架构·github
吴仰晖2 小时前
使用github copliot chat的源码学习之Chromium Compositor
前端
1024小神2 小时前
github发布pages的几种状态记录
前端
不像程序员的程序媛4 小时前
Nginx日志切分
服务器·前端·nginx
Daniel李华4 小时前
echarts使用案例
android·javascript·echarts
北原_春希4 小时前
如何在Vue3项目中引入并使用Echarts图表
前端·javascript·echarts
JY-HPS4 小时前
echarts天气折线图
javascript·vue.js·echarts
尽意啊4 小时前
echarts树图动态添加子节点
前端·javascript·echarts
吃面必吃蒜4 小时前
echarts 极坐标柱状图 如何定义柱子颜色
前端·javascript·echarts
O_oStayPositive5 小时前
Vue3使用ECharts
前端·javascript·echarts