From 3263f3ebcbbf079589ec1309c87f3fd3079546b0 Mon Sep 17 00:00:00 2001 From: Lxy Date: Wed, 18 Feb 2026 23:54:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E8=87=AA=E9=80=89?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/dashboard/Dashboard.jsx | 65 +++++------------------ src/pages/watchlist/Watchlist.css | 15 ------ src/pages/watchlist/Watchlist.jsx | 86 +++---------------------------- src/store/futuresSlice.js | 56 +++++--------------- 4 files changed, 32 insertions(+), 190 deletions(-) diff --git a/src/pages/dashboard/Dashboard.jsx b/src/pages/dashboard/Dashboard.jsx index b4ee1e4..e79f45f 100644 --- a/src/pages/dashboard/Dashboard.jsx +++ b/src/pages/dashboard/Dashboard.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { Card, Row, Col, Statistic, Button, Select, Tag, message, Spin, Alert, Dropdown, Menu } from 'antd'; +import { Card, Row, Col, Statistic, Button, Select, Tag, message, Spin, Alert } from 'antd'; import { ReloadOutlined, ArrowUpOutlined, ArrowDownOutlined, FireOutlined, AlertOutlined, RobotOutlined } from '@ant-design/icons'; import { fetchFuturesOverview, fetchRiskAlerts, fetchAIMarketAnalysis, toggleWatchlist } from '../../store/futuresSlice'; import { useNavigate } from 'react-router-dom'; @@ -11,10 +11,9 @@ const { Option } = Select; const Dashboard = () => { const dispatch = useDispatch(); const navigate = useNavigate(); - const { overview, riskAlerts, aiAnalysis, loading, watchlists, currentWatchlist } = useSelector(state => state.futures); + const { overview, riskAlerts, aiAnalysis, loading } = useSelector(state => state.futures); const [filterType, setFilterType] = useState('all'); const [sortBy, setSortBy] = useState('winRate'); - const [showWatchlistMenu, setShowWatchlistMenu] = useState(null); useEffect(() => { dispatch(fetchFuturesOverview()); @@ -35,21 +34,8 @@ const Dashboard = () => { const handleToggleWatchlist = (future, e) => { e.stopPropagation(); - if (watchlists.length > 1 && !future.isInWatchlist) { - // 如果有多个自选组合且合约未在自选中,显示下拉菜单 - setShowWatchlistMenu(future.code); - } else { - // 否则直接切换自选状态 - dispatch(toggleWatchlist({ code: future.code, watchlistId: currentWatchlist })); - message.success(future.isInWatchlist ? '已从自选移除' : '已添加到自选'); - } - }; - - const handleAddToWatchlist = (code, watchlistId, e) => { - e.stopPropagation(); - dispatch(toggleWatchlist({ code, watchlistId })); - message.success('已添加到自选'); - setShowWatchlistMenu(null); + dispatch(toggleWatchlist(future.code)); + message.success(future.isInWatchlist ? '已从自选移除' : '已添加到自选'); }; const getChangeColor = (changePercent) => { @@ -316,41 +302,14 @@ const Dashboard = () => { - {watchlists.length > 1 && !item.isInWatchlist ? ( - { - if (open) { - setShowWatchlistMenu(item.code); - } else { - setShowWatchlistMenu(null); - } - }} - overlay={ - - {watchlists.map(watchlist => ( - handleAddToWatchlist(item.code, watchlist.id, e)}> - {watchlist.name} - - ))} - - } - trigger={['click']} - > - - - ) : ( - - )} + diff --git a/src/pages/watchlist/Watchlist.css b/src/pages/watchlist/Watchlist.css index 341e76b..169bf5b 100644 --- a/src/pages/watchlist/Watchlist.css +++ b/src/pages/watchlist/Watchlist.css @@ -9,21 +9,6 @@ margin-bottom: 24px; } -.watchlist-header-left { - display: flex; - align-items: center; - gap: 16px; -} - -.watchlist-selector { - margin-left: 16px; -} - -.watchlist-header-actions { - display: flex; - gap: 16px; -} - .watchlist-header h2 { margin: 0; color: #262626; diff --git a/src/pages/watchlist/Watchlist.jsx b/src/pages/watchlist/Watchlist.jsx index 90d9c82..d6d4b83 100644 --- a/src/pages/watchlist/Watchlist.jsx +++ b/src/pages/watchlist/Watchlist.jsx @@ -1,8 +1,8 @@ import React, { useEffect, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { Card, Row, Col, Button, Select, Tag, message, Spin, Input, Modal, Popconfirm } from 'antd'; -import { ReloadOutlined, ArrowUpOutlined, ArrowDownOutlined, StarOutlined, DeleteOutlined, PlusOutlined, MoreOutlined } from '@ant-design/icons'; -import { fetchFuturesOverview, toggleWatchlist, createWatchlist, selectWatchlist, deleteWatchlist } from '../../store/futuresSlice'; +import { Card, Row, Col, Button, Select, Tag, message, Spin } from 'antd'; +import { ReloadOutlined, ArrowUpOutlined, ArrowDownOutlined, StarOutlined, DeleteOutlined } from '@ant-design/icons'; +import { fetchFuturesOverview, toggleWatchlist } from '../../store/futuresSlice'; import { useNavigate } from 'react-router-dom'; import './Watchlist.css'; @@ -11,10 +11,8 @@ const { Option } = Select; const Watchlist = () => { const dispatch = useDispatch(); const navigate = useNavigate(); - const { overview, watchlists, currentWatchlist, loading } = useSelector(state => state.futures); + const { overview, watchlist, loading } = useSelector(state => state.futures); const [filterType, setFilterType] = useState('all'); - const [showCreateModal, setShowCreateModal] = useState(false); - const [newWatchlistName, setNewWatchlistName] = useState(''); useEffect(() => { dispatch(fetchFuturesOverview()); @@ -29,32 +27,11 @@ const Watchlist = () => { navigate(`/detail/${future.code}`); }; - const handleToggleWatchlist = (future, e) => { - e.stopPropagation(); - dispatch(toggleWatchlist({ code: future.code, watchlistId: currentWatchlist })); + const handleToggleWatchlist = (future) => { + dispatch(toggleWatchlist(future.code)); message.success(future.isInWatchlist ? '已从自选移除' : '已添加到自选'); }; - const handleCreateWatchlist = () => { - if (newWatchlistName.trim()) { - dispatch(createWatchlist({ name: newWatchlistName.trim() })); - message.success('新自选组合创建成功'); - setShowCreateModal(false); - setNewWatchlistName(''); - } else { - message.error('请输入自选组合名称'); - } - }; - - const handleSelectWatchlist = (watchlistId) => { - dispatch(selectWatchlist(watchlistId)); - }; - - const handleDeleteWatchlist = (watchlistId) => { - dispatch(deleteWatchlist(watchlistId)); - message.success('自选组合删除成功'); - }; - const getChangeColor = (changePercent) => { return changePercent >= 0 ? '#52c41a' : '#ff4d4f'; }; @@ -70,9 +47,7 @@ const Watchlist = () => { }; const getWatchlistData = () => { - const currentWl = watchlists.find(wl => wl.id === currentWatchlist); - if (!currentWl) return []; - return overview.filter(item => currentWl.codes.includes(item.code)); + return overview.filter(item => watchlist.includes(item.code)); }; if (loading && overview.length === 0) { @@ -89,31 +64,8 @@ const Watchlist = () => {
{/* 页面头部 */}
-
-

自选合约

-
- -
-
+

自选合约

- , - - ]} - > - setNewWatchlistName(e.target.value)} - style={{ marginBottom: 16 }} - /> -
); }; diff --git a/src/store/futuresSlice.js b/src/store/futuresSlice.js index 6b4dc76..6385cb3 100644 --- a/src/store/futuresSlice.js +++ b/src/store/futuresSlice.js @@ -50,14 +50,7 @@ const futuresSlice = createSlice({ aiAnalysis: null, loading: false, error: null, - watchlists: [ - { - id: 'default', - name: '默认自选', - codes: [] - } - ], - currentWatchlist: 'default' + watchlist: [] }, reducers: { selectFuture: (state, action) => { @@ -67,46 +60,21 @@ const futuresSlice = createSlice({ state.selectedFuture = null; }, toggleWatchlist: (state, action) => { - const { code, watchlistId = state.currentWatchlist } = action.payload; - const targetWatchlist = state.watchlists.find(wl => wl.id === watchlistId); - if (targetWatchlist) { - const index = targetWatchlist.codes.indexOf(code); - if (index > -1) { - targetWatchlist.codes.splice(index, 1); - } else { - targetWatchlist.codes.push(code); - } + const code = action.payload; + const index = state.watchlist.indexOf(code); + if (index > -1) { + state.watchlist.splice(index, 1); + } else { + state.watchlist.push(code); } // 更新overview中每个合约的自选状态 state.overview = state.overview.map(item => ({ ...item, - isInWatchlist: state.watchlists.some(wl => wl.codes.includes(item.code)) + isInWatchlist: state.watchlist.includes(item.code) })); // 更新selectedFuture的自选状态 if (state.selectedFuture && state.selectedFuture.code === code) { - state.selectedFuture.isInWatchlist = state.watchlists.some(wl => wl.codes.includes(code)); - } - }, - createWatchlist: (state, action) => { - const { name } = action.payload; - const newWatchlist = { - id: `wl-${Date.now()}`, - name, - codes: [] - }; - state.watchlists.push(newWatchlist); - state.currentWatchlist = newWatchlist.id; - }, - selectWatchlist: (state, action) => { - state.currentWatchlist = action.payload; - }, - deleteWatchlist: (state, action) => { - const watchlistId = action.payload; - if (watchlistId !== 'default') { - state.watchlists = state.watchlists.filter(wl => wl.id !== watchlistId); - if (state.currentWatchlist === watchlistId) { - state.currentWatchlist = 'default'; - } + state.selectedFuture.isInWatchlist = state.watchlist.includes(code); } } }, @@ -122,7 +90,7 @@ const futuresSlice = createSlice({ // 更新overview数据并添加自选状态 state.overview = action.payload.map(item => ({ ...item, - isInWatchlist: state.watchlists.some(wl => wl.codes.includes(item.code)) + isInWatchlist: state.watchlist.includes(item.code) })); }) .addCase(fetchFuturesOverview.rejected, (state, action) => { @@ -140,7 +108,7 @@ const futuresSlice = createSlice({ // 更新selectedFuture数据并添加自选状态 state.selectedFuture = { ...action.payload, - isInWatchlist: state.watchlists.some(wl => wl.codes.includes(action.payload.code)) + isInWatchlist: state.watchlist.includes(action.payload.code) }; console.log('fetchFutureDetail fulfilled with:', action.payload); }) @@ -180,5 +148,5 @@ const futuresSlice = createSlice({ } }); -export const { selectFuture, clearSelectedFuture, toggleWatchlist, createWatchlist, selectWatchlist, deleteWatchlist } = futuresSlice.actions; +export const { selectFuture, clearSelectedFuture, toggleWatchlist } = futuresSlice.actions; export default futuresSlice.reducer;