From 2e89469d05ec153e61795a23d8784545098ad49a Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Wed, 5 Nov 2025 17:50:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E7=BA=B5=E5=90=91?= =?UTF-8?q?=E5=88=97=E8=A1=A8UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicNewsCard/VerticalModeLayout.js | 117 +++++++++--------- 1 file changed, 57 insertions(+), 60 deletions(-) diff --git a/src/views/Community/components/DynamicNewsCard/VerticalModeLayout.js b/src/views/Community/components/DynamicNewsCard/VerticalModeLayout.js index 25ef5a31..aaaafc9d 100644 --- a/src/views/Community/components/DynamicNewsCard/VerticalModeLayout.js +++ b/src/views/Community/components/DynamicNewsCard/VerticalModeLayout.js @@ -2,18 +2,19 @@ // 纵向分栏模式布局组件 import React, { useState } from 'react'; -import { Grid, GridItem, IconButton, Tooltip, VStack } from '@chakra-ui/react'; +import { Box, IconButton, Tooltip, VStack, Flex } from '@chakra-ui/react'; import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons'; import HorizontalDynamicNewsEventCard from '../EventCard/HorizontalDynamicNewsEventCard'; import EventDetailScrollPanel from './EventDetailScrollPanel'; +import PaginationControl from './PaginationControl'; /** * 纵向分栏模式布局 * 支持两种展示模式: * - detail(默认):左侧事件列表 1fr | 右侧详情 2fr - * - list:左侧事件列表 3fr | 右侧详情 150px + * - list:左侧事件列表 7fr | 右侧详情 300px * - * 左侧使用分页模式(不使用虚拟滚动),右侧支持布局切换 + * 左侧使用分页模式,高度根据内容自适应,分页控制器在左侧列表底部 * * @param {Array} events - 当前页的事件列表(分页数据) * @param {Object} selectedEvent - 当前选中的事件 @@ -22,9 +23,9 @@ import EventDetailScrollPanel from './EventDetailScrollPanel'; * @param {Function} onToggleFollow - 关注按钮回调 * @param {Function} getTimelineBoxStyle - 时间线样式获取函数 * @param {string} borderColor - 边框颜色 - * @param {string} scrollbarTrackBg - 滚动条轨道背景色 - * @param {string} scrollbarThumbBg - 滚动条滑块背景色 - * @param {string} scrollbarThumbHoverBg - 滚动条滑块悬浮背景色 + * @param {number} currentPage - 当前页码 + * @param {number} totalPages - 总页数 + * @param {Function} onPageChange - 页码改变回调 */ const VerticalModeLayout = ({ events, @@ -34,72 +35,71 @@ const VerticalModeLayout = ({ onToggleFollow, getTimelineBoxStyle, borderColor, - scrollbarTrackBg, - scrollbarThumbBg, - scrollbarThumbHoverBg, + currentPage, + totalPages, + onPageChange, }) => { // 布局模式状态:'detail' = 聚焦详情(默认),'list' = 聚焦列表 - const [layoutMode, setLayoutMode] = useState('detail'); + const [layoutMode, setLayoutMode] = useState('list'); // 切换布局模式 const toggleLayoutMode = () => { setLayoutMode(prev => prev === 'detail' ? 'list' : 'detail'); }; - // 根据模式计算 Grid 的 templateColumns - const gridTemplateColumns = layoutMode === 'detail' ? '1fr 2fr' : '7fr 300px'; + // 根据模式计算 flex 比例 + const leftFlex = layoutMode === 'detail' ? '4' : '6'; + const rightFlex = layoutMode === 'detail' ? '6' : '4'; return ( - {/* 左侧:事件列表 - 使用分页模式 */} - + + {/* 事件列表 */} - {events.map((event) => ( - onEventSelect(event)} - isFollowing={eventFollowStatus[event.id]?.isFollowing} - followerCount={eventFollowStatus[event.id]?.followerCount} - onToggleFollow={onToggleFollow} - timelineStyle={getTimelineBoxStyle()} - borderColor={borderColor} - /> - ))} + {events.map((event) => ( + onEventSelect(event)} + isFollowing={eventFollowStatus[event.id]?.isFollowing} + followerCount={eventFollowStatus[event.id]?.followerCount} + onToggleFollow={onToggleFollow} + timelineStyle={getTimelineBoxStyle()} + borderColor={borderColor} + indicatorSize={layoutMode === 'detail' ? 'default' : 'comfortable'} + /> + ))} - - {/* 右侧:事件详情 (66.7%) */} - + {/* 分页控制器 */} + {totalPages > 1 && ( + + + + )} + + + {/* 右侧:事件详情 */} + {/* 布局切换按钮 */} : } onClick={toggleLayoutMode} aria-label="切换布局模式" colorScheme="blue" - variant="ghost" + variant="solid" /> {/* 详情面板 */} - - + + ); };