Vue-Pinia defineStore 语法结构

好,这一段是 Pinia 的 settings 全局配置仓库 ,再加上 VueUse 的暗黑模式

你现在问的是 「语法结构」 ,我就不扯业务细节 ,专门把 每一层语法是干嘛的、为什么这样写 讲清楚。


一、整体结构一眼看懂

ts 复制代码
import ...
import ...

const xxx = ...
const yyy = ...

const useSettingsStore = defineStore(
  'settings',
  {
    state: () => ({}),
    actions: {}
  }
)

export default useSettingsStore

👉 这是 Pinia 的标准 Store 定义结构

可以拆成 5 个语法层级

  1. import(依赖引入)
  2. 顶层普通变量(非响应式)
  3. defineStore 定义 store
  4. state:响应式状态
  5. actions:方法(可改 state)

二、import 语法层

ts 复制代码
import defaultSettings from '@/settings'
  • 默认导入
  • defaultSettings 是一个普通 JS 对象(不是响应式)
ts 复制代码
import { useDark, useToggle } from '@vueuse/core'
  • 命名导入
  • VueUse 提供的组合式函数
ts 复制代码
import { useDynamicTitle } from '@/utils/dynamicTitle'
  • 自定义工具函数
  • 修改 document.title

三、普通变量(不属于 Pinia)

ts 复制代码
const isDark = useDark()
const toggleDark = useToggle(isDark)

语法重点

  • 写在 store 外面
  • 只会执行一次
  • 不会被 Pinia 重建
ts 复制代码
isDark         // Ref<boolean>
toggleDark()  // 切换 isDark.value

👉 这是 组合式 API + Pinia 混用的典型写法


四、解构默认配置(ES6 解构语法)

ts 复制代码
const {
  sideTheme,
  showSettings,
  navType,
  tagsView,
  tagsIcon,
  fixedHeader,
  sidebarLogo,
  dynamicTitle,
  footerVisible,
  footerContent
} = defaultSettings

等价于:

ts 复制代码
const sideTheme = defaultSettings.sideTheme
const showSettings = defaultSettings.showSettings
...

作用:

  • 减少 defaultSettings.xxx 的重复书写
  • 提高可读性

五、localStorage 读取(短路语法)

ts 复制代码
const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''

语法点

  • JSON.parse(null)null
  • null || ''''

👉 所以 storageSetting 要么是对象,要么是空字符串

⚠️ 这也是为什么下面频繁用 === undefined 判断


六、defineStore 语法结构(重点)

ts 复制代码
const useSettingsStore = defineStore(
  'settings',
  {
    state: () => ({}),
    actions: {}
  }
)

1️⃣ 'settings'

ts 复制代码
'settings'
  • store 的唯一 ID

  • 用于:

    • devtools
    • pinia 持久化
    • 跨模块引用

2️⃣ state: () => ({})

ts 复制代码
state: () => ({
  title: '',
  theme: ...,
  isDark: isDark.value
})
语法规则
  • 必须是 函数
  • 返回一个 普通对象
  • Pinia 内部会自动转为 reactive

等价概念:

ts 复制代码
const state = reactive({
  title: ''
})

3️⃣ state 中的"或运算符 + 三元"

典型例子:

ts 复制代码
theme: storageSetting.theme || '#409EFF'
ts 复制代码
navType:
  storageSetting.navType === undefined
    ? navType
    : storageSetting.navType
为什么不用 ||
ts 复制代码
false || true  // 会变成 true(不符合预期)

所以用:

ts 复制代码
=== undefined ? 默认值 : 本地值

👉 这是一个非常成熟的 JS 防坑写法


七、actions 语法结构

1️⃣ 普通方法写法

ts 复制代码
actions: {
  changeSetting(data) {
    ...
  }
}

等价于:

ts 复制代码
changeSetting: function (data) {}

但这是 ES6 简写


2️⃣ this 的含义(关键)

ts 复制代码
this[key] = value

在 Pinia 的 actions 中:

  • this 👉 store 实例
  • 等价于:
ts 复制代码
const store = useSettingsStore()
store[key] = value

3️⃣ hasOwnProperty 防御式写法

ts 复制代码
if (this.hasOwnProperty(key)) {
  this[key] = value
}

防止:

  • 写入不存在的字段
  • 拼写错误污染 store

4️⃣ setTitle 的语法重点

ts 复制代码
setTitle(title) {
  this.title = title
  useDynamicTitle()
}
  • 修改 state
  • 调用副作用函数
  • actions 可以有副作用(state 不行)

5️⃣ 切换暗黑模式

ts 复制代码
toggleTheme() {
  this.isDark = !this.isDark
  toggleDark()
}

语法重点:

  • this.isDark:Pinia 状态
  • toggleDark():VueUse 的 ref 操作
  • 两者同步,但不是同一个对象

八、export default

ts 复制代码
export default useSettingsStore

使用方式:

ts 复制代码
const settingsStore = useSettingsStore()
settingsStore.toggleTheme()

九、一句话总结「语法结构」

这是「选项式 Pinia + 组合式 API」的混合写法

部分 作用
import 引入依赖
顶层 const 非响应式工具
defineStore 定义 store
state 响应式数据
actions 修改 state 的方法

如果你下一步想搞清楚:

  • 🔍 为什么 isDark 不直接放 state 里
  • 🧠 defineStore vs setup store 的区别
  • 🧹 怎么改成 setup 风格

你直接说一句:
"讲 Pinia setup 写法""这段怎么简化" 就行。

相关推荐
码丁_1176 分钟前
为什么前端需要做优化?
前端
Mr Xu_18 分钟前
告别硬编码:前端项目中配置驱动的实战优化指南
前端·javascript·数据结构
Byron07071 小时前
从 0 到 1 搭建 Vue 前端工程化体系:提效、提质、降本实战落地
前端·javascript·vue.js
哆啦code梦1 小时前
前端存储三剑客:localStorage、sessionStorage与Cookie解析
前端·前端存储
zhengfei6111 小时前
【AI平台】- 基于大模型的知识库与知识图谱智能体开发平台
vue.js·语言模型·langchain·知识图谱·多分类
徐小夕@趣谈前端1 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
Data_Journal1 小时前
如何使用 Python 解析 JSON 数据
大数据·开发语言·前端·数据库·人工智能·php
德育处主任Pro1 小时前
纯前端网格路径规划:PathFinding.js的使用方法
开发语言·前端·javascript
墨笔.丹青1 小时前
基于QtQuick开发界面设计出简易的HarmonyUI界面----下
开发语言·前端·javascript
董世昌412 小时前
深度解析浅拷贝与深拷贝:底层逻辑、实现方式及实战避坑
前端·javascript·vue.js