首页 > 其他分享 >Pinia 替代 localStorage 的常规使用场景

Pinia 替代 localStorage 的常规使用场景

时间:2025-01-14 16:10:42浏览次数:1  
标签:场景 const auth token localStorage useAuthStore Pinia isAuthenticated

在现代 Vue 工程化项目中,通常推荐使用 Pinia(或 Vuex)来管理状态,而不是直接使用 localStorage。我来解释下具体原因和使用方式:

1、为什么使用 Pinia 替代 localStorage:

// 使用 Pinia 的优势:
- 状态集中管理,更容易维护
- 支持响应式
- 支持开发工具调试
- 支持 TypeScript
- 可以配合 localStorage 实现数据持久化
- 状态变更可追踪

2、一个典型的用户认证 Store 示例:

// stores/auth.js
import { defineStore } from 'pinia'

export const useAuthStore = defineStore('auth', {
  state: () => ({
    isAuthenticated: false,
    token: null,
    user: null
  }),
  
  actions: {
    login(credentials) {
      // 登录逻辑
      // ...
      this.isAuthenticated = true;
      this.token = 'token-value';
      // 如果需要持久化,可以同时存储到 localStorage
      localStorage.setItem('token', this.token);
    },
    
    logout() {
      this.isAuthenticated = false;
      this.token = null;
      this.user = null;
      localStorage.removeItem('token');
    },
    
    // 初始化状态,比如页面刷新后
    initializeAuth() {
      const token = localStorage.getItem('token');
      if (token) {
        this.token = token;
        this.isAuthenticated = true;
      }
    }
  },
  
  getters: {
    // 计算属性
    isUserLoggedIn: (state) => state.isAuthenticated,
    currentUser: (state) => state.user
  }
})

3、在路由守卫中使用:

// router/index.js
import { useAuthStore } from '@/stores/auth'

router.beforeEach((to, from, next) => {
  const authStore = useAuthStore()
  
  // 需要认证的路由
  if (to.meta.requiresAuth && !authStore.isAuthenticated) {
    next({ name: 'login' })
  } else {
    next()
  }
})

4、在组件中使用:

<template>
  <div>
    <h1>Admin Dashboard</h1>
    <div v-if="authStore.isUserLoggedIn">
      Welcome, {{ authStore.currentUser?.name }}
    </div>
  </div>
</template>

<script setup>
import { useAuthStore } from '@/stores/auth'

const authStore = useAuthStore()

// 组件内使用
const handleLogout = () => {
  authStore.logout()
}
</script>

5、配合插件实现自动持久化(可选):

// 使用 pinia-plugin-persistedstate 插件
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

// 在 store 中启用持久化
export const useAuthStore = defineStore('auth', {
  state: () => ({
    // ...
  }),
  persist: true // 启用持久化
})

6、最佳实践:

// 1. 分层管理
// api/auth.js - API 请求
export const authApi = {
  login: (credentials) => axios.post('/api/login', credentials),
  logout: () => axios.post('/api/logout')
}

// stores/auth.js - 状态管理
export const useAuthStore = defineStore('auth', {
  // ...store 配置
})

// 2. 错误处理
actions: {
  async login(credentials) {
    try {
      const response = await authApi.login(credentials)
      this.setUser(response.data.user)
      return Promise.resolve('Success')
    } catch (error) {
      return Promise.reject(error)
    }
  }
}

// 3. 类型支持
interface User {
  id: number
  name: string
  email: string
}

interface AuthState {
  user: User | null
  isAuthenticated: boolean
  token: string | null
}

使用 Pinia 的主要好处是:

  1. 状态管理更规范
  2. 数据响应式,自动更新视图
  3. 可以配合 TypeScript 获得更好的类型支持
  4. 支持开发工具,方便调试
  5. 可以实现状态持久化
  6. 便于测试和维护
  7. 状态变更可追踪,便于调试

当然,在某些简单的场景下,直接使用 localStorage 也是可以的。选择哪种方式主要取决于:

  • 项目规模和复杂度
  • 团队规模和开发规范
  • 是否需要状态响应式
  • 是否需要更好的开发体验
  • 是否需要类型支持

在中大型项目中,推荐使用 Pinia 来管理状态,可以获得更好的可维护性和开发体验。

标签:场景,const,auth,token,localStorage,useAuthStore,Pinia,isAuthenticated
From: https://www.cnblogs.com/linxmouse/p/18671021

相关文章

  • 应用场景——教育培训类二、学习路径规划助手开发实战(根据学生画像生成学习规划)
    通过大模型实现个性化学习路径规划与自适应教育在现代教育中,个性化学习正在逐步成为一种趋势。每个学生都有不同的学习需求、兴趣偏好和学习节奏。传统的“一刀切”教学模式很难满足每个学生的个性化需求。因此,如何为学生提供个性化的学习路径规划,帮助他们以最合适的方式进......
  • cliproxy海外 IP 的应用场景
    在当今全球化与数字化深度交织的时代,海外IP扮演着愈发关键的角色,其应用场景广泛地渗透到诸多领域,为个人、企业乃至科研机构开辟了新的发展路径。一、跨境电商运营对于跨境电商从业者而言,海外IP堪称业务拓展的得力助手。一方面,在店铺注册环节,部分海外电商平台基于地域限制......
  • uniapp精仿微信UI,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频
    uniapp精仿微信UI,基于SumerUI和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,视频商城小工具等,朋友圈视频号即时聊天用于视频,商城,直播,聊天,等等场景,源码分享sumer-weixin介绍uniapp精仿微信UI界面,基于SumerUI3.0和Uniapp前端框架的一款仿微信APP应用,界面漂亮颜值高,......
  • C++中线程同步与互斥的4种方式介绍、对比、场景举例
    在C++中,当两个或更多的线程需要访问共享数据时,就会出现线程安全问题。这是因为,如果没有适当的同步机制,一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据,这将导致数据的不一致性和程序的不可预测性。为了解决这个问题,C++提供了多种线程同步和互斥的机制。1.......
  • margin和padding使用的场景有哪些?
    在前端开发中,margin和padding是两个非常重要的CSS属性,它们分别用于控制元素外部和内部的间距。以下是margin和padding使用的具体场景:margin的使用场景:元素间距调整:当需要调整不同元素之间的距离时,可以使用margin。例如,设置两个段落之间的间距,使得页面布局更加清晰和美观。外部......
  • 说说你对域名收敛和域名发散的理解?分别在什么场景下使用?
    域名收敛和域名发散是前端开发中两种常见的资源加载策略,它们主要涉及到静态资源的组织和加载方式。下面是对这两种策略的理解及其使用场景的描述:域名发散:理解:域名发散是指将静态资源(如图片、CSS、JavaScript等)分布在不同的子域名下。这样做主要是为了突破浏览器对同一域名下并......
  • 【Unity 编辑器插件】Stranger Lands - StampIT! 旨在简化和加速游戏场景构建中的地形
    StrangerLands-StampIT!是一款Unity插件,专为游戏开发者设计,旨在简化和加速游戏场景构建中的地形、地图和环境资源布局。它特别适用于需要大规模、快速生成或修改地形的项目,如开放世界、冒险类游戏、沙盒游戏等。通过该插件,开发者可以通过简单的操作快速“印刷”出各种地形......
  • 实战自动化加解密&加密场景下的暴力破解,黑客技术零基础入门到精通实战教程!
    场景拿到一个站,请求和响应中的数据均经过加密,但是我们想在测试中看到明文数据并可以修改前两天看到有个师傅的使用双层mitmproxy代理实现自动化加解密的思路,今天来实现一下。顺便回忆一下该场景下使用Yakit热加载进行数据暴力破解。思路请求:设置下游代理捕获浏览器......
  • 大模型应用场景落地:实操项目全解析
    你是否学习了大模型技术,但是不知道如何落地?今天带来5个大模型落地项目,保证你看完一定有所收获!前排提示,文末有大模型AGI-CSDN独家资料包哦!大模型应用#1:从Chatbot到AIAgent,个人助理重塑手机应用生态AI大模型的能力进步推动Chatbot在C端广泛“出圈”。Chatbot(聊天机器人)通......
  • 主流的液冷技术分类、优缺点与应用场景分析
     ......