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

相关推荐
weixin_382395233 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__3 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.4 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~5 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子8 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅8 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni9 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端