前端学习笔记-vue状态管理优化

15 扁平化你的 Store,合理使用持久化

一句话理解

Store(Pinia / Vuex)里的数据结构要像数据库表一样扁平 (用 id 做关联,别深层嵌套);持久化(存 localStorage)要有选择,别什么都存。

为什么

  • 深层嵌套的 Store → 更新困难、响应式开销大(呼应第 07 条)。比如要改"文章 5 的评论 3 的点赞数",深层路径又慢又容易写错。
  • 扁平化(normalized) → 用 { [id]: item } 的 map 结构,查找 O(1),更新精准。
  • 持久化全存 → localStorage 有容量限制(5MB 左右),存太多会卡、还会存进敏感数据。

代码示例

反例:嵌套 + 全量持久化:

js 复制代码
// 嵌套结构:改一个评论的点赞数要穿透 3 层
const badStore = {
  posts: [
    {
      id: 1,
      title: '...',
      comments: [
        { id: 10, likes: 5, author: { id: 7, name: '张三' } }
      ]
    }
  ]
}

正例:扁平化(像数据库表):

js 复制代码
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'

export const useForumStore = defineStore('forum', () => {
  // 三张"表",用 id 关联,互不嵌套
  const posts = ref({})           // { [postId]: post }
  const comments = ref({})        // { [commentId]: comment }
  const users = ref({})           // { [userId]: user }

  // O(1) 查找某篇文章
  const getPost = (id) => posts.value[id]

  // 精准更新某条评论的点赞数,不影响其它数据
  const likeComment = (commentId) => {
    comments.value[commentId].likes++
  }

  return { posts, comments, users, getPost, likeComment }
})

有选择地持久化(只存该存的):

js 复制代码
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useUserStore = defineStore('user', () => {
  const token = ref('')        // 持久化:登录态
  const profile = ref({})      // 持久化:用户资料

  const tempCaptcha = ref('')  // 不持久化:临时验证码
  const formDraft = ref({})    // 不持久化:表单草稿

  // 手动持久化关键数据(或用 pinia-plugin-persistedstate 按需配置)
  function persist() {
    localStorage.setItem('token', token.value)
  }

  return { token, profile, tempCaptcha, formDraft, persist }
})
</script>

新人提示

  • 扁平化的核心思想:数据按"实体"分表,用 id 互相引用,和后端数据库设计同源。
  • 持久化的判断:"刷新页面后还需要吗?" 需要(如登录态)→ 存;不需要(如临时状态)→ 不存。
  • 别持久化敏感数据(密码、密钥)到 localStorage,它对任何 JS 都开放。
相关推荐
zoe驿鹿4 小时前
【CI/CD】前端工程化与自动化:从“手工作坊”到“现代化工厂”的演进之路
前端·ci/cd·自动化
lupai4 小时前
增值税发票 OCR 识别 API 新手接入指南
java·前端·ocr
reasonsummer4 小时前
【办公类-120-01】20260812闵行区幼儿园概况表的数据统计(户籍、五类性质、优抚子女)
前端·python
宿6744 小时前
vue3-指令和事件处理
开发语言·前端·javascript
云边有个稻草人4 小时前
复盘小站:用 Doubao-Seed-Evolving,把厚厚的笔记一键变成可复习、可自测、可批改的知识资产
笔记·doubao·ai开发实战·复盘小站
风骏时光牛马4 小时前
AI助手异常问题Debug排查
前端
梦想的旅途24 小时前
企业微信API实战:Python自动化消息推送
java·前端·python·自动化·企业微信
恋猫de小郭4 小时前
Flutter 3.47 发布,快来看看有什么更新吧
android·前端·flutter
程序员黑豆4 小时前
Java 内存存储机制:基本数据类型 vs 引用数据类型
前端·ai编程·全栈
90后的晨仔4 小时前
uni-app 三方库与插件管理体系全解析:从原生开发者视角彻底讲透
前端