useAppStorage 是一个强大的组合式函数,它结合了 @vueuse/core 的 useStorage 和 Zod 的验证能力,可以安全、轻松地管理浏览器的 localStorage 或 sessionStorage。
它会自动处理数据的序列化、反序列化以及基于您提供的 Zod schema 的验证。
<script setup lang="ts">
import { useAppStorage } from '@movk/core'
import { z } from 'zod'
// 1. 定义数据的 Zod schema
const userPrefsSchema = z.object({
theme: z.enum(['light', 'dark']).default('light'),
language: z.string().default('en'),
notifications: z.object({
email: z.boolean().default(true),
push: z.boolean().default(false)
})
})
// 2. 创建一个响应式的、经过验证的存储实例
const { state, setItem, getItem, removeItem } = useAppStorage({
key: 'user-preferences',
defaultValue: {
theme: 'light',
language: 'en',
notifications: {
email: true,
push: false
}
},
schema: userPrefsSchema,
storage: 'localStorage', // or 'sessionStorage'
prefix: 'my-app'
})
// 3. 在模板或脚本中直接使用响应式状态
console.log(state.value.theme) // 'light'
// 4. 安全地更新数据(会自动进行验证)
function toggleTheme() {
setItem({
...state.value,
theme: state.value.theme === 'light' ? 'dark' : 'light'
})
}
// 5. 尝试设置无效数据将被阻止
function setInvalidData() {
setItem({
...state.value,
theme: 'system' // 'system' is not in the enum, so this update will be ignored.
})
console.log(state.value.theme) // 仍然是 'dark' 或 'light'
}
</script>
<template>
<div>
<p>当前主题: {{ state.theme }}</p>
<button @click="toggleTheme">
切换主题
</button>
<button @click="setInvalidData">
设置无效主题
</button>
</div>
</template>
schema 验证时,useAppStorage 会自动使用 defaultValue 并将警告信息打印到控制台。同样,当尝试 setItem 一个无效值时,操作将被中止,并打印警告。useAppStorage(config)创建并返回一个存储实例。
config 参数T 的类型应与 schema 匹配。localStorage。key 前面的可选前缀,用于创建命名空间,避免键名冲突。最终的键将是 prefix:key。useAppStorage 返回一个包含以下属性的对象:
schema 验证。7a568 — feat: 初始化项目结构与核心功能