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

相关推荐
m0_748252383 小时前
JavaScript 基本语法
开发语言·javascript·ecmascript
hhcccchh3 小时前
学习vue第十三天 Vue3组件深入指南:组件的艺术与科学
javascript·vue.js·学习
@PHARAOH3 小时前
WHAT - Vercel react-best-practices 系列(二)
前端·javascript·react.js
qq_406176143 小时前
深入理解 JavaScript 闭包:从原理到实战避坑
开发语言·前端·javascript
float_六七3 小时前
JavaScript变量声明:var的奥秘
开发语言·前端·javascript
zhengxianyi5153 小时前
ruoyi-vue-pro本地环境搭建(超级详细,带异常处理)
前端·vue.js·前后端分离·ruoyi-vue-pro
桃子叔叔4 小时前
react-wavesurfer录音组件1:从需求到组件一次说清楚
前端·react.js·前端框架
陈随易4 小时前
聊一聊2025年用AI的思考与总结
前端·后端·程序员
@PHARAOH4 小时前
WHAT - React startTransition vs setTimeout vs debounce
前端·react.js·前端框架
研☆香4 小时前
JavaScript 特点介绍
开发语言·javascript·ecmascript