You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将.onChange()抽离为可复用视图以避免重复编写冗余代码

实现方案:封装SwiftUI ViewModifier

你可以通过自定义ViewModifier将这部分onChange逻辑完全抽离封装,既可以保留访问环境状态的能力,又能实现全局复用,无需重复编写逻辑:

步骤1:定义自定义Modifier

import SwiftUI

struct WalletReloadModifier: ViewModifier {
    // 如需使用环境状态,直接在此处通过@Environment注入即可
    @ObservedObject var walletVM: WalletDataStoreHandlerViewModel
    let user: User
    
    func body(content: Content) -> some View {
        content
            .onChange(of: walletVM.walletsReceivedNewValue) { newValue in
                guard !walletVM.reloadingWallets else { return }
                walletVM.reloadingWallets = true
                print("🟢 Reloading wallet....")
                
                Task {
                    try await walletVM.getUserWallets(user: user)
                }
            }
    }
}

步骤2:添加View扩展实现链式调用

extension View {
    func autoReloadWallets(
        viewModel: WalletDataStoreHandlerViewModel,
        user: User
    ) -> some View {
        modifier(WalletReloadModifier(walletVM: viewModel, user: user))
    }
}

调用方式

后续所有需要添加该逻辑的视图,只需要加一行修饰符即可:

// 你的原有视图代码
YourCustomView()
    .autoReloadWallets(viewModel: walletDataStoreHandlerViewModel, user: user)

优化说明

如果user参数已经注册为环境值,你可以直接在Modifier内通过@Environment(\.currentUser) private var user注入,不需要调用时手动传参,进一步简化调用代码。

内容的提问来源于stack exchange,提问作者Albert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:09:03