diff --git a/src/views/Community/components/DynamicNews/layouts/MainlineTimelineView.js b/src/views/Community/components/DynamicNews/layouts/MainlineTimelineView.js
index 192de442..1d70855b 100644
--- a/src/views/Community/components/DynamicNews/layouts/MainlineTimelineView.js
+++ b/src/views/Community/components/DynamicNews/layouts/MainlineTimelineView.js
@@ -288,6 +288,8 @@ const MainlineTimelineViewComponent = forwardRef(
const [groupBy, setGroupBy] = useState("lv2");
// 层级选项(从 API 获取)
const [hierarchyOptions, setHierarchyOptions] = useState({ lv1: [], lv2: [], lv3: [] });
+ // 排序方式: 'event_count' | 'change_desc' | 'change_asc'
+ const [sortBy, setSortBy] = useState("event_count");
// 根据主线类型获取配色
const getColorScheme = useCallback((lv2Name) => {
@@ -372,11 +374,9 @@ const MainlineTimelineViewComponent = forwardRef(
const apiBase = getApiBase();
const params = new URLSearchParams();
- // 添加筛选参数
+ // 添加筛选参数(主线模式只保留时间范围筛选)
if (filters.recent_days)
params.append("recent_days", filters.recent_days);
- if (filters.importance && filters.importance !== "all")
- params.append("importance", filters.importance);
// 添加分组方式参数
params.append("group_by", groupBy);
@@ -397,15 +397,8 @@ const MainlineTimelineViewComponent = forwardRef(
});
if (result.success) {
- // 按事件数量从多到少排序
- const sortedMainlines = [...(result.data.mainlines || [])].sort(
- (a, b) => b.event_count - a.event_count
- );
-
- setMainlineData({
- ...result.data,
- mainlines: sortedMainlines,
- });
+ // 保存原始数据,排序在渲染时根据 sortBy 状态进行
+ setMainlineData(result.data);
// 保存层级选项供下拉框使用
if (result.data.hierarchy_options) {
@@ -414,7 +407,7 @@ const MainlineTimelineViewComponent = forwardRef(
// 初始化展开状态(默认全部展开)
const initialExpanded = {};
- sortedMainlines.forEach((mainline) => {
+ (result.data.mainlines || []).forEach((mainline) => {
const groupId = mainline.group_id || mainline.lv2_id || mainline.lv1_id;
initialExpanded[groupId] = true;
});
@@ -428,7 +421,7 @@ const MainlineTimelineViewComponent = forwardRef(
} finally {
setLoading(false);
}
- }, [display, filters.recent_days, filters.importance, groupBy]);
+ }, [display, filters.recent_days, groupBy]);
// 初始加载 & 筛选变化时刷新
useEffect(() => {
@@ -517,12 +510,30 @@ const MainlineTimelineViewComponent = forwardRef(
}
const {
- mainlines,
+ mainlines: rawMainlines,
total_events,
mainline_count,
ungrouped_count,
} = mainlineData;
+ // 根据排序方式排序主线列表
+ const mainlines = useMemo(() => {
+ if (!rawMainlines) return [];
+ const sorted = [...rawMainlines];
+ switch (sortBy) {
+ case "change_desc":
+ // 按涨跌幅从高到低(涨幅大的在前)
+ return sorted.sort((a, b) => (b.avg_change_pct ?? -999) - (a.avg_change_pct ?? -999));
+ case "change_asc":
+ // 按涨跌幅从低到高(跌幅大的在前)
+ return sorted.sort((a, b) => (a.avg_change_pct ?? 999) - (b.avg_change_pct ?? 999));
+ case "event_count":
+ default:
+ // 按事件数量从多到少
+ return sorted.sort((a, b) => b.event_count - a.event_count);
+ }
+ }, [rawMainlines, sortBy]);
+
return (
+ {/* 排序方式选择器 */}
+
}