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 写法" 或 "这段怎么简化" 就行。

相关推荐
福兮说2 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理2 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源3 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源3 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6663 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人3 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)3 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan4 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_5 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒5 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端