From 25fec8a2e6e7b803b38008563a47be624545f4c5 Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Thu, 24 Jul 2025 10:20:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=BC=BAFeedListFeature?= =?UTF-8?q?=E5=92=8CMeFeature=E7=9A=84=E9=A6=96=E6=AC=A1=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在FeedListFeature和MeFeature中新增isFirstLoad状态,确保仅在首次加载时请求数据。 - 更新MainView以简化视图切换逻辑,使用isHidden修饰符控制视图显示。 - 新增View+isHidden扩展,提供视图隐藏功能,提升代码可读性和复用性。 --- yana/Features/FeedListFeature.swift | 6 +++--- yana/Features/MainFeature.swift | 4 ++-- yana/Features/MeFeature.swift | 15 ++++--------- yana/Views/Components/View+isHidden.swift | 12 +++++++++++ yana/Views/MainView.swift | 26 ++++++++++------------- 5 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 yana/Views/Components/View+isHidden.swift diff --git a/yana/Features/FeedListFeature.swift b/yana/Features/FeedListFeature.swift index 0b5a326..6bd493c 100644 --- a/yana/Features/FeedListFeature.swift +++ b/yana/Features/FeedListFeature.swift @@ -5,6 +5,7 @@ import ComposableArchitecture struct FeedListFeature { @Dependency(\.apiService) var apiService struct State: Equatable { + var isFirstLoad: Bool = true var feeds: [Feed] = [] // 预留 feed 内容 var isLoading: Bool = false var error: String? = nil @@ -35,9 +36,8 @@ struct FeedListFeature { func reduce(into state: inout State, action: Action) -> Effect { switch action { case .onAppear: - // 只在首次加载时请求 feed 数据 - guard !state.isLoaded else { return .none } - state.isLoaded = true + guard state.isFirstLoad else { return .none } + state.isFirstLoad = false return .send(.fetchFeeds) case .reload: // 下拉刷新,重置状态并请求第一页 diff --git a/yana/Features/MainFeature.swift b/yana/Features/MainFeature.swift index ea7b3c1..f24c505 100644 --- a/yana/Features/MainFeature.swift +++ b/yana/Features/MainFeature.swift @@ -103,10 +103,10 @@ struct MainFeature: Reducer { } } // 设置页作用域 - .ifLet(\ .settingState, action: /Action.settingAction) { + .ifLet(\ .settingState, action: \.settingAction) { SettingFeature() } - .ifLet(\ .appSettingState, action: /Action.appSettingAction) { + .ifLet(\ .appSettingState, action: \.appSettingAction) { AppSettingFeature() } } diff --git a/yana/Features/MeFeature.swift b/yana/Features/MeFeature.swift index 4d9ece5..e8589ba 100644 --- a/yana/Features/MeFeature.swift +++ b/yana/Features/MeFeature.swift @@ -5,6 +5,7 @@ import ComposableArchitecture struct MeFeature { @Dependency(\.apiService) var apiService struct State: Equatable { + var isFirstLoad: Bool = true var userInfo: UserInfo? var isLoadingUserInfo: Bool = false var userInfoError: String? @@ -32,17 +33,9 @@ struct MeFeature { func reduce(into state: inout State, action: Action) -> Effect { switch action { case .onAppear: - guard state.uid > 0 else { return .none } - state.isLoadingUserInfo = true - state.isLoadingMoments = true - state.userInfoError = nil - state.momentsError = nil - state.page = 1 - state.hasMore = true - return .merge( - fetchUserInfo(uid: state.uid), - fetchMoments(uid: state.uid, page: 1, pageSize: state.pageSize) - ) + guard state.isFirstLoad else { return .none } + state.isFirstLoad = false + return .send(.refresh) case .refresh: guard state.uid > 0 else { return .none } state.isRefreshing = true diff --git a/yana/Views/Components/View+isHidden.swift b/yana/Views/Components/View+isHidden.swift new file mode 100644 index 0000000..40dd1ba --- /dev/null +++ b/yana/Views/Components/View+isHidden.swift @@ -0,0 +1,12 @@ +import SwiftUI + +extension View { + @ViewBuilder + func isHidden(_ hidden: Bool) -> some View { + if hidden { + self.opacity(0).allowsHitTesting(false) + } else { + self + } + } +} \ No newline at end of file diff --git a/yana/Views/MainView.swift b/yana/Views/MainView.swift index 8bfd671..737d6c3 100644 --- a/yana/Views/MainView.swift +++ b/yana/Views/MainView.swift @@ -18,22 +18,18 @@ struct MainView: View { .ignoresSafeArea(.all) // 主内容 ZStack { - switch viewStore.selectedTab { - case .feed: - FeedListView(store: store.scope( - state: \.feedList, - action: \.feedList - )) - .transition(.opacity) - case .other: - MeView( - store: store.scope( - state: \.me, - action: \.me - ) + FeedListView(store: store.scope( + state: \.feedList, + action: \.feedList + )) + .isHidden(viewStore.selectedTab != .feed) + MeView( + store: store.scope( + state: \.me, + action: \.me ) - .transition(.opacity) - } + ) + .isHidden(viewStore.selectedTab != .other) } .frame(maxWidth: .infinity, maxHeight: .infinity) // 测试按钮