mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-06-27 18:41:58 +08:00
Remove PWA state management documentation files
Co-authored-by: jxxghp <jxxghp@163.com>
This commit is contained in:
376
PWA增强功能总结.md
376
PWA增强功能总结.md
@@ -1,376 +0,0 @@
|
||||
# PWA状态管理实现总结
|
||||
|
||||
## 问题分析
|
||||
|
||||
用户反馈的问题:
|
||||
1. **滚动条位置不能记住** - 原有的滚动位置管理不够完善
|
||||
2. **用户打开的弹窗不能记住** - 缺少弹窗状态的跟踪和恢复
|
||||
3. **正在输入的表单等不能记住** - 表单数据保存不够实时
|
||||
4. **性能影响** - 用户反馈实时监听太重,影响性能
|
||||
|
||||
## 轻量级解决方案
|
||||
|
||||
### 设计理念
|
||||
|
||||
**按需收集,避免实时监听**
|
||||
- 只在页面隐藏时收集状态,不添加任何实时监听器
|
||||
- 零性能影响,不干扰正常页面交互
|
||||
- 简化实现,提高可维护性
|
||||
|
||||
### 1. 轻量级状态收集器 (`LightweightStateCollector`)
|
||||
|
||||
**核心特性:**
|
||||
- <20> **零监听器**:不添加任何事件监听器
|
||||
- ⚡ **按需收集**:只在页面隐藏时执行状态收集
|
||||
- 🎯 **智能过滤**:只收集有意义的状态(有值的字段、有滚动的容器等)
|
||||
- 🛡️ **安全性**:自动跳过密码字段和隐藏字段
|
||||
|
||||
**支持的滚动容器:**
|
||||
```css
|
||||
.v-main__wrap
|
||||
.v-card-text
|
||||
.v-sheet
|
||||
.perfect-scrollbar
|
||||
[data-simplebar]
|
||||
.overflow-auto
|
||||
.overflow-y-auto
|
||||
```
|
||||
|
||||
**实现原理:**
|
||||
- 使用静态方法,按需执行DOM查询
|
||||
- 只收集有滚动偏移的容器
|
||||
- 生成精确的CSS选择器用于恢复
|
||||
|
||||
### 2. 智能弹窗状态收集
|
||||
|
||||
**核心特性:**
|
||||
- 🪟 **显示状态检测**:检查弹窗的实际显示状态
|
||||
- 💾 **内容提取**:提取弹窗内的表单数据和滚动位置
|
||||
- 🔄 **事件恢复**:通过自定义事件通知应用恢复状态
|
||||
|
||||
**支持的弹窗类型:**
|
||||
```css
|
||||
.v-dialog
|
||||
.v-menu
|
||||
.v-overlay
|
||||
.v-tooltip
|
||||
.v-snackbar
|
||||
.modal
|
||||
.popup
|
||||
.drawer
|
||||
.v-navigation-drawer
|
||||
[role="dialog"]
|
||||
[role="alertdialog"]
|
||||
```
|
||||
|
||||
**实现原理:**
|
||||
- 遍历所有弹窗选择器,检查显示状态
|
||||
- 提取弹窗内的有效数据
|
||||
- 通过 `CustomEvent` 提供恢复接口
|
||||
|
||||
### 3. 高效表单数据收集
|
||||
|
||||
**核心特性:**
|
||||
- 📝 **有值收集**:只收集有值或被选中的字段
|
||||
- 🎯 **简化选择器**:生成更简洁的CSS选择器
|
||||
- 🔄 **类型完整**:支持所有表单元素类型
|
||||
- 🛡️ **隐私保护**:跳过密码和隐藏字段
|
||||
|
||||
**支持的表单元素:**
|
||||
```javascript
|
||||
input, textarea, select (除password和hidden类型)
|
||||
```
|
||||
|
||||
**实现原理:**
|
||||
- 遍历所有表单元素,过滤有效数据
|
||||
- 生成简化的CSS选择器路径
|
||||
- 保存完整的字段状态信息
|
||||
|
||||
### 4. 轻量级PWA状态控制器
|
||||
|
||||
**改进内容:**
|
||||
- <20> **移除实时监听**:删除所有事件监听器和定时器
|
||||
- 💾 **多重存储策略**:localStorage + IndexedDB + Service Worker
|
||||
- 🔄 **智能状态恢复**:根据URL匹配度决定恢复哪些状态
|
||||
- 🧹 **简化清理**:无需复杂的资源清理
|
||||
|
||||
**新增数据结构:**
|
||||
```typescript
|
||||
interface PWAState {
|
||||
url: string
|
||||
scrollPosition: number
|
||||
scrollPositions: ScrollPosition[] // 新增:多个滚动位置
|
||||
orientation: number
|
||||
timestamp: number
|
||||
appData?: any
|
||||
formData?: Record<string, any>
|
||||
formFields?: FormFieldState[] // 新增:详细的表单字段状态
|
||||
modalStates?: ModalState[] // 新增:弹窗状态
|
||||
userSelections?: {
|
||||
selectedItems: string[]
|
||||
activeTab?: string
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 技术实现细节
|
||||
|
||||
### 存储策略
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[用户操作] --> B[实时检测]
|
||||
B --> C[防抖处理]
|
||||
C --> D[sessionStorage]
|
||||
D --> E[定期同步]
|
||||
E --> F[localStorage]
|
||||
E --> G[IndexedDB]
|
||||
E --> H[Service Worker]
|
||||
```
|
||||
|
||||
**存储分层:**
|
||||
- **sessionStorage**:实时状态(滚动位置、表单输入、弹窗状态)
|
||||
- **localStorage**:持久状态(应用设置、用户偏好)
|
||||
- **IndexedDB**:复杂状态数据(大量数据、结构化数据)
|
||||
- **Service Worker**:离线状态同步
|
||||
|
||||
### 性能优化
|
||||
|
||||
**零性能开销:**
|
||||
- 无事件监听器:不添加任何实时监听器
|
||||
- 无定时器:不使用防抖和节流
|
||||
- 按需执行:只在页面隐藏时执行状态收集
|
||||
|
||||
**内存效率:**
|
||||
- 静态方法:使用静态方法,减少对象创建
|
||||
- 按需查询:状态收集时才执行DOM查询
|
||||
- 智能过滤:只收集有价值的状态数据
|
||||
|
||||
### 兼容性处理
|
||||
|
||||
**向后兼容:**
|
||||
- 保留原有的 `scrollPosition` 字段
|
||||
- 新增的 `scrollPositions` 数组优先使用
|
||||
- 渐进式增强,不影响现有功能
|
||||
|
||||
**错误处理:**
|
||||
- 所有存储操作都包含 try-catch
|
||||
- 静默处理错误,不影响主要功能
|
||||
- 提供调试模式,便于开发时排查问题
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 自动功能(无需配置)
|
||||
|
||||
用户无需做任何配置,以下功能自动生效:
|
||||
|
||||
1. **滚动位置自动保存和恢复**
|
||||
2. **表单数据实时保存**
|
||||
3. **弹窗状态自动跟踪**
|
||||
|
||||
### 手动集成(可选)
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<v-container>
|
||||
<!-- 滚动位置会自动保存 -->
|
||||
<v-main class="overflow-auto">
|
||||
<div v-for="item in items" :key="item.id">
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</v-main>
|
||||
|
||||
<!-- 表单数据会自动保存 -->
|
||||
<v-form>
|
||||
<v-text-field
|
||||
v-model="formData.name"
|
||||
label="姓名"
|
||||
name="name"
|
||||
/>
|
||||
</v-form>
|
||||
|
||||
<!-- 弹窗状态会自动跟踪 -->
|
||||
<v-dialog v-model="dialog" id="my-dialog">
|
||||
<v-card>
|
||||
<v-card-text>
|
||||
<v-text-field
|
||||
v-model="dialogData.value"
|
||||
label="值"
|
||||
name="dialog-value"
|
||||
/>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
|
||||
const formData = ref({ name: '' })
|
||||
const dialog = ref(false)
|
||||
const dialogData = ref({ value: '' })
|
||||
|
||||
// 监听PWA状态恢复事件
|
||||
onMounted(() => {
|
||||
window.addEventListener('pwaStateRestored', (event) => {
|
||||
console.log('PWA状态已恢复:', event.detail.state)
|
||||
})
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
### 弹窗状态恢复
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref, onMounted, onUnmounted } from 'vue'
|
||||
|
||||
const dialog = ref(false)
|
||||
const modalData = ref({})
|
||||
|
||||
const handleModalRestore = (event) => {
|
||||
const state = event.detail
|
||||
if (state.id === 'my-dialog') {
|
||||
dialog.value = true
|
||||
modalData.value = state.data || {}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
window.addEventListener('restoreModalState', handleModalRestore)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('restoreModalState', handleModalRestore)
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
## 调试和监控
|
||||
|
||||
### 检查状态保存
|
||||
|
||||
```javascript
|
||||
// 在浏览器控制台中执行
|
||||
console.log('滚动位置:', sessionStorage.getItem('mp-scroll-positions'))
|
||||
console.log('弹窗状态:', sessionStorage.getItem('mp-modal-states'))
|
||||
console.log('表单字段:', sessionStorage.getItem('mp-form-fields'))
|
||||
```
|
||||
|
||||
### 监控PWA状态
|
||||
|
||||
```javascript
|
||||
// 监听状态恢复事件
|
||||
window.addEventListener('pwaStateRestored', (event) => {
|
||||
console.log('PWA状态恢复:', event.detail.state)
|
||||
})
|
||||
|
||||
// 检查控制器状态
|
||||
if (window.pwaStateController) {
|
||||
console.log('PWA控制器已可用')
|
||||
console.log('正在恢复状态:', window.pwaStateController.isRestoringState)
|
||||
}
|
||||
```
|
||||
|
||||
## 文件变更列表
|
||||
|
||||
### 修改的文件
|
||||
|
||||
1. **`src/utils/pwaStateManager.ts`**
|
||||
- 新增 `EnhancedScrollManager` 类
|
||||
- 新增 `ModalStateManager` 类
|
||||
- 新增 `RealTimeFormManager` 类
|
||||
- 增强 `PWAStateController` 类
|
||||
- 扩展 `PWAState` 接口
|
||||
|
||||
2. **`src/main.ts`**
|
||||
- 添加页面隐藏事件监听
|
||||
- 添加PWA状态管理器清理逻辑
|
||||
|
||||
### 新增的文件
|
||||
|
||||
1. **`src/utils/pwaEnhancedUsage.md`**
|
||||
- 完整的使用指南
|
||||
- 示例代码
|
||||
- 调试方法
|
||||
- 故障排除
|
||||
|
||||
2. **`PWA增强功能总结.md`**
|
||||
- 技术实现总结
|
||||
- 功能特性说明
|
||||
|
||||
## 优势和效果
|
||||
|
||||
### 解决的问题
|
||||
|
||||
✅ **滚动位置完全恢复**
|
||||
- 支持页面滚动和容器滚动
|
||||
- 智能识别滚动容器
|
||||
- 精确恢复滚动位置
|
||||
|
||||
✅ **弹窗状态完整保存**
|
||||
- 自动检测弹窗开关
|
||||
- 保存弹窗内的表单数据
|
||||
- 恢复弹窗的滚动位置
|
||||
|
||||
✅ **表单数据实时保存**
|
||||
- 500ms防抖,实时保存
|
||||
- 支持所有表单元素类型
|
||||
- 精确恢复用户输入
|
||||
|
||||
### 性能优化
|
||||
|
||||
⚡ **高效的事件处理**
|
||||
- 防抖和节流优化
|
||||
- 智能的DOM变化监听
|
||||
- 最小化性能影响
|
||||
|
||||
💾 **多重存储策略**
|
||||
- sessionStorage:实时状态
|
||||
- localStorage:持久状态
|
||||
- IndexedDB:复杂数据
|
||||
- Service Worker:离线同步
|
||||
|
||||
🧹 **完善的资源管理**
|
||||
- 自动清理过期状态
|
||||
- 组件卸载时清理监听器
|
||||
- 内存泄漏防护
|
||||
|
||||
## 后续改进建议
|
||||
|
||||
1. **增加更多容器类型支持**
|
||||
- 支持自定义滚动容器
|
||||
- 支持第三方组件库
|
||||
|
||||
2. **增强弹窗状态恢复**
|
||||
- 支持嵌套弹窗
|
||||
- 支持动态弹窗
|
||||
|
||||
3. **优化存储策略**
|
||||
- 压缩存储数据
|
||||
- 增加数据加密
|
||||
|
||||
4. **增加用户配置选项**
|
||||
- 允许用户禁用某些功能
|
||||
- 提供更多自定义选项
|
||||
|
||||
## 结论
|
||||
|
||||
通过实现轻量级状态管理,PWA应用现在可以:
|
||||
|
||||
1. **零性能影响地保存状态**:无实时监听,不影响页面性能
|
||||
2. **智能收集有效状态**:只收集有意义的数据,避免冗余
|
||||
3. **完整恢复用户状态**:滚动位置、表单数据、弹窗状态全部恢复
|
||||
4. **简化维护成本**:代码更简洁,更易维护
|
||||
|
||||
### 性能对比
|
||||
|
||||
**原实现 vs 轻量级实现:**
|
||||
- 事件监听器:多个 → 0个
|
||||
- 定时器:3个 → 0个
|
||||
- 内存占用:高 → 极低
|
||||
- CPU占用:持续 → 按需
|
||||
- 代码复杂度:高 → 低
|
||||
|
||||
这个轻量级实现完全解决了用户反馈的所有问题,同时消除了性能影响,是一个更优雅的解决方案。
|
||||
@@ -1,319 +0,0 @@
|
||||
# PWA状态管理使用指南
|
||||
|
||||
## 概述
|
||||
|
||||
轻量级PWA状态管理器提供了以下功能:
|
||||
- 🔄 **智能滚动位置管理**:退到后台时收集和保存滚动位置
|
||||
- 📝 **表单数据保存**:退到后台时保存用户输入的表单数据
|
||||
- 🎛️ **弹窗状态管理**:退到后台时保存打开的弹窗状态
|
||||
|
||||
## 工作原理
|
||||
|
||||
**轻量级设计**:不使用实时监听,只在页面隐藏时收集状态,避免影响性能。
|
||||
|
||||
### 状态收集时机
|
||||
- 页面隐藏(`visibilitychange`)
|
||||
- 页面卸载(`beforeunload`)
|
||||
- 手动调用保存方法
|
||||
|
||||
### 收集的状态
|
||||
1. **滚动位置**:主窗口和常见容器的滚动位置
|
||||
2. **表单数据**:所有有值的表单字段(跳过密码字段)
|
||||
3. **弹窗状态**:当前打开的弹窗及其内容
|
||||
|
||||
## 在Vue组件中使用
|
||||
|
||||
### 基本用法
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<v-container>
|
||||
<!-- 滚动位置会自动保存和恢复 -->
|
||||
<v-main class="overflow-auto">
|
||||
<div v-for="item in items" :key="item.id">
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</v-main>
|
||||
|
||||
<!-- 表单数据会自动保存和恢复 -->
|
||||
<v-form ref="formRef">
|
||||
<v-text-field
|
||||
v-model="formData.name"
|
||||
label="姓名"
|
||||
name="name"
|
||||
/>
|
||||
<v-textarea
|
||||
v-model="formData.description"
|
||||
label="描述"
|
||||
name="description"
|
||||
/>
|
||||
<v-select
|
||||
v-model="formData.type"
|
||||
:items="typeOptions"
|
||||
label="类型"
|
||||
name="type"
|
||||
/>
|
||||
</v-form>
|
||||
|
||||
<!-- 弹窗状态会自动保存和恢复 -->
|
||||
<v-dialog v-model="dialog" max-width="600">
|
||||
<v-card>
|
||||
<v-card-title>设置</v-card-title>
|
||||
<v-card-text class="overflow-auto">
|
||||
<v-form>
|
||||
<v-text-field
|
||||
v-model="dialogFormData.setting"
|
||||
label="设置项"
|
||||
name="setting"
|
||||
/>
|
||||
</v-form>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted } from 'vue'
|
||||
|
||||
const formData = ref({
|
||||
name: '',
|
||||
description: '',
|
||||
type: ''
|
||||
})
|
||||
|
||||
const dialogFormData = ref({
|
||||
setting: ''
|
||||
})
|
||||
|
||||
const dialog = ref(false)
|
||||
const items = ref([])
|
||||
|
||||
// 监听PWA状态恢复事件
|
||||
onMounted(() => {
|
||||
window.addEventListener('pwaStateRestored', (event) => {
|
||||
console.log('PWA状态已恢复:', event.detail.state)
|
||||
// 可以在这里执行额外的恢复逻辑
|
||||
})
|
||||
})
|
||||
</script>
|
||||
```
|
||||
|
||||
### 手动保存状态
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const saveState = async () => {
|
||||
const controller = window.pwaStateController
|
||||
if (controller) {
|
||||
await controller.saveCurrentState()
|
||||
console.log('状态已保存')
|
||||
}
|
||||
}
|
||||
|
||||
const checkPWAController = () => {
|
||||
return !!window.pwaStateController
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<v-btn @click="saveState" :disabled="!checkPWAController()">
|
||||
手动保存状态
|
||||
</v-btn>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 弹窗状态恢复监听
|
||||
|
||||
```vue
|
||||
<script setup>
|
||||
import { ref, onMounted, onUnmounted } from 'vue'
|
||||
|
||||
const dialog = ref(false)
|
||||
const modalData = ref({})
|
||||
|
||||
const handleModalRestore = (event) => {
|
||||
const state = event.detail
|
||||
if (state.id === 'my-modal') {
|
||||
dialog.value = true
|
||||
modalData.value = state.data || {}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
window.addEventListener('restoreModalState', handleModalRestore)
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('restoreModalState', handleModalRestore)
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<v-dialog v-model="dialog" id="my-modal">
|
||||
<v-card>
|
||||
<v-card-text>
|
||||
<v-form>
|
||||
<v-text-field
|
||||
v-model="modalData.value"
|
||||
label="值"
|
||||
name="modal-value"
|
||||
/>
|
||||
</v-form>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</template>
|
||||
```
|
||||
|
||||
## 高级配置
|
||||
|
||||
### 自定义滚动容器
|
||||
|
||||
如果你有自定义的滚动容器,可以添加类名让系统自动跟踪:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<div class="custom-scroll-container overflow-auto">
|
||||
<!-- 内容 -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.custom-scroll-container {
|
||||
height: 400px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### 表单字段命名
|
||||
|
||||
为了更好的状态恢复,建议为表单字段添加 `name` 属性:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<v-form>
|
||||
<v-text-field
|
||||
v-model="data.username"
|
||||
label="用户名"
|
||||
name="username"
|
||||
/>
|
||||
<v-password-field
|
||||
v-model="data.password"
|
||||
label="密码"
|
||||
name="password"
|
||||
/>
|
||||
</v-form>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 弹窗标识
|
||||
|
||||
为弹窗添加唯一标识,便于状态恢复:
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<v-dialog v-model="dialog" id="settings-dialog">
|
||||
<!-- 弹窗内容 -->
|
||||
</v-dialog>
|
||||
</template>
|
||||
```
|
||||
|
||||
## 调试和监控
|
||||
|
||||
### 手动触发状态保存
|
||||
|
||||
```javascript
|
||||
// 手动保存当前状态
|
||||
if (window.pwaStateController) {
|
||||
window.pwaStateController.saveCurrentState()
|
||||
.then(() => console.log('状态保存成功'))
|
||||
.catch(err => console.error('状态保存失败:', err))
|
||||
}
|
||||
```
|
||||
|
||||
### 监控PWA状态
|
||||
|
||||
```javascript
|
||||
// 监听状态恢复事件
|
||||
window.addEventListener('pwaStateRestored', (event) => {
|
||||
console.log('PWA状态恢复:', event.detail.state)
|
||||
})
|
||||
|
||||
// 检查PWA控制器状态
|
||||
if (window.pwaStateController) {
|
||||
console.log('PWA控制器已可用')
|
||||
console.log('正在恢复状态:', window.pwaStateController.isRestoringState)
|
||||
}
|
||||
```
|
||||
|
||||
### 测试状态收集
|
||||
|
||||
```javascript
|
||||
// 测试状态收集功能
|
||||
const { StateCollector } = await import('@/utils/pwaStateManager')
|
||||
|
||||
console.log('滚动位置:', StateCollector.collectScrollPositions())
|
||||
console.log('弹窗状态:', StateCollector.collectModalStates())
|
||||
console.log('表单字段:', StateCollector.collectFormFields())
|
||||
```
|
||||
|
||||
## 性能优势
|
||||
|
||||
### 轻量级设计
|
||||
- **零实时监听**:不添加事件监听器,不影响页面性能
|
||||
- **按需收集**:只在页面隐藏时收集状态
|
||||
- **无防抖需要**:不需要防抖和节流
|
||||
|
||||
### 存储策略
|
||||
- **localStorage**:持久状态(应用设置、用户数据)
|
||||
- **IndexedDB**:复杂状态数据(大量数据)
|
||||
- **Service Worker**:离线状态同步
|
||||
|
||||
### 内存效率
|
||||
- **无常驻对象**:不维护状态缓存
|
||||
- **静态方法**:使用静态方法,减少内存占用
|
||||
- **按需加载**:状态收集时才执行DOM查询
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **状态没有保存**
|
||||
- 检查是否在PWA环境中运行
|
||||
- 确认页面隐藏事件是否触发
|
||||
- 手动调用 `saveCurrentState()` 测试
|
||||
|
||||
2. **滚动位置没有恢复**
|
||||
- 确保滚动容器有支持的CSS类名
|
||||
- 检查URL是否完全匹配
|
||||
|
||||
3. **表单数据没有恢复**
|
||||
- 确保表单字段有 `name` 或 `id` 属性
|
||||
- 检查字段在保存时是否有值
|
||||
|
||||
4. **弹窗状态没有恢复**
|
||||
- 确保弹窗在页面隐藏时是打开状态
|
||||
- 检查弹窗是否使用了支持的CSS选择器
|
||||
|
||||
### 调试方法
|
||||
|
||||
```javascript
|
||||
// 在页面隐藏前手动测试状态收集
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
if (document.hidden) {
|
||||
console.log('页面隐藏,开始收集状态...')
|
||||
// 在这里添加断点或日志
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
|
||||
- **仅在PWA环境有效**:状态管理只在PWA模式下工作
|
||||
- **密码字段跳过**:密码和隐藏字段不会被保存
|
||||
- **URL匹配限制**:只有URL完全匹配才恢复滚动位置和表单数据
|
||||
- **轻量级设计**:不监听实时事件,性能友好但精度相对较低
|
||||
Reference in New Issue
Block a user