Files
vf_react/src/views/Community/components/DynamicNewsCard/constants.js
zdl ddd6b2d4af feat: 实现 Socket 触发的智能列表自动刷新功能(带防抖)
核心改动:
- 扩展 NotificationContext,添加事件更新回调注册机制
- VirtualizedFourRowGrid 添加 forwardRef 暴露 getScrollPosition 方法
- DynamicNewsCard 实现智能刷新逻辑(根据模式和滚动位置判断是否刷新)
- Community 页面注册 Socket 回调自动触发刷新
- 创建 TypeScript 通用防抖工具函数(debounce.ts)
- 集成防抖机制(2秒延迟),避免短时间内频繁请求

智能刷新策略:
- 纵向模式 + 第1页:自动刷新列表
- 纵向模式 + 其他页:不刷新(避免打断用户)
- 平铺模式 + 滚动在顶部:自动刷新列表
- 平铺模式 + 滚动不在顶部:仅显示 Toast 提示

防抖效果:
- 短时间内收到多个新事件,只执行最后一次刷新
- 减少服务器压力,提升用户体验

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 19:04:00 +08:00

59 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// src/views/Community/components/DynamicNewsCard/constants.js
// 动态新闻卡片组件 - 常量配置
// ========== 分页配置常量 ==========
/**
* 分页大小计算依据:
*
* 【四排模式 (FOUR_ROW_PAGE_SIZE)】
* - 容器高度: 800px (VirtualizedFourRowGrid)
* - 单行高度: ~250px (包含卡片 + 间距)
* - 每行显示: 4 列
* - 可视区域: 800px / 250px ≈ 3.2 行
* - overscan 缓冲: 2 行 (上下各预渲染1行)
* - 实际渲染区域: 3.2 + 2 = 5.2 行
* - 单次加载数据量: 7.5 行 × 4 列 = 30 个
* - 设计目标: 提供充足的缓冲数据,确保快速滚动时不出现空白
*
* 【纵向模式 (VERTICAL_PAGE_SIZE)】
* - 每页显示 10 条数据
* - 使用传统分页器,用户手动翻页
*/
export const PAGINATION_CONFIG = {
FOUR_ROW_PAGE_SIZE: 30, // 平铺模式每页数量 (7.5行 × 4列包含缓冲)
VERTICAL_PAGE_SIZE: 10, // 纵向模式每页数量 (传统分页)
INITIAL_PAGE: 1, // 初始页码
};
// ========== 显示模式常量 ==========
export const DISPLAY_MODES = {
FOUR_ROW: 'four-row', // 平铺网格模式
VERTICAL: 'vertical', // 纵向分栏模式
};
export const DEFAULT_MODE = DISPLAY_MODES.VERTICAL;
// ========== Toast 提示配置 ==========
export const TOAST_CONFIG = {
DURATION_ERROR: 3000, // 错误提示持续时间(毫秒)
DURATION_WARNING: 2000, // 警告提示持续时间(毫秒)
};
// ========== Socket 刷新防抖配置 ==========
/**
* Socket 新事件刷新防抖延迟(毫秒)
*
* 作用:避免短时间内收到多个新事件时频繁刷新列表
*
* 场景示例:
* - 第 1 秒:收到新事件 → 延迟 2 秒刷新
* - 第 2 秒:收到新事件 → 取消上次,重新延迟 2 秒
* - 第 3 秒:收到新事件 → 取消上次,重新延迟 2 秒
* - 第 5 秒:触发刷新 → 只发送 1 次 API 请求
*
* 推荐值2000ms (2 秒)
* - 太短(如 500ms→ 仍可能触发多次刷新
* - 太长(如 5000ms→ 用户感知延迟过高
*/
export const REFRESH_DEBOUNCE_DELAY = 2000;