当前位置: 首页 > wzjs >正文

进一步加强区门户网站建设管理企业画册设计欣赏

进一步加强区门户网站建设管理,企业画册设计欣赏,上海建设工程咨询有限公司,网站模板如何修改目录一、核心生命周期阶段1. 视图初始化(init)2. 视图构建 (body)3. 视图出现 (.onAppear)4. 视图消失 (.onDisappear)5. 视图更新 (状态变化)二、高级生命周期管理1. 异步任务管理 (.task)2. 状态变化响应 (.onChange)3. 相位变化跟踪 (.onChange(of: scenePhase))4. 事务处理…

目录

      • 一、核心生命周期阶段
        • 1. 视图初始化(`init`)
        • 2. 视图构建 (`body`)
        • 3. 视图出现 (`.onAppear`)
        • 4. 视图消失 (`.onDisappear`)
        • 5. 视图更新 (状态变化)
      • 二、高级生命周期管理
        • 1. 异步任务管理 (`.task`)
        • 2. 状态变化响应 (`.onChange`)
        • 3. 相位变化跟踪 (`.onChange(of: scenePhase)`)
        • 4. 事务处理 (`.transaction`)
      • 三、生命周期流程图
      • 四、实际应用场景
        • 1. 数据加载模式
        • 2. 资源管理
        • 3. 状态恢复
      • 五、最佳实践与注意事项
      • 六、与 UIKit 生命周期对比

在SwiftUI中,页面生命周期(更准确地说,是视图的生命周期)与UIKit的ViewController生命周期不同,它更加简洁,采用声明式编程模型。SwiftUI通过修饰符和状态管理来处理视图的创建、更新和销毁。以下是 SwiftUI 视图生命周期的完整解析:


一、核心生命周期阶段

1. 视图初始化(init)
struct ContentView: View {@State private var count = 0// 初始化init() {print("视图初始化")}var body: some View {// ...}
}
  • 当视图首次创建或需要重建时调用
  • 注意:SwiftUI 可能频繁创建视图实例(值类型结构体),不要在此执行耗时操作
2. 视图构建 (body)
var body: some View {VStack {Text("计数: \(count)")Button("增加") { count += 1 }}.onAppear { print("视图内容构建完成") }
}
  • 每次状态变化时都会重新计算
  • 应保持轻量级,避免复杂逻辑
3. 视图出现 (.onAppear)
Text("Hello").onAppear {// 视图显示在屏幕上时调用print("视图出现 - 加载数据")loadData()}
  • 相当于 UIKit 的 viewDidAppear
  • 最佳位置进行数据加载、启动定时器等
  • 嵌套视图:子视图的 onAppear 在父视图之后调用
4. 视图消失 (.onDisappear)
Text("Goodbye").onDisappear {// 视图从屏幕移除时调用print("视图消失 - 清理资源")cancelRequests()}
  • 相当于 UIKit 的 viewDidDisappear
  • 用于取消网络请求、停止定时器、保存数据等清理操作
  • 嵌套视图:子视图的 onDisappear 在父视图之前调用
5. 视图更新 (状态变化)
@State private var searchText = ""var body: some View {TextField("搜索", text: $searchText).onChange(of: searchText) { old, new inprint("搜索词变化: \(old)\(new)")}
}
  • @State@Binding@ObservedObject 等状态变化时触发视图更新

二、高级生命周期管理

1. 异步任务管理 (.task)
VStack {// ...
}
.task {// 自动管理生命周期的异步任务do {let data = try await fetchData()// 更新状态} catch {// 错误处理}
}
  • 自动取消:视图消失时自动取消未完成的任务
  • 重新启动:视图重新出现时自动重新执行(除非使用 .task(id:)
2. 状态变化响应 (.onChange)
@State private var selectedTab = 0var body: some View {TabView(selection: $selectedTab) {// ...}.onChange(of: selectedTab) { oldTab, newTab inprint("标签页变化: \(oldTab)\(newTab)")}
}
3. 相位变化跟踪 (.onChange(of: scenePhase))
@Environment(\.scenePhase) private var scenePhasevar body: some View {ContentView().onChange(of: scenePhase) { oldPhase, newPhase inswitch newPhase {case .active: print("应用进入前台")case .inactive:print("应用即将进入后台")case .background:print("应用进入后台")@unknown default: break}}
}
4. 事务处理 (.transaction)
Button("动画更新") {var transaction = Transaction()transaction.animation = .spring()withTransaction(transaction) {// 带特定动画的状态变化scale *= 1.5}
}

三、生命周期流程图

状态变化
视图移除
视图初始化 init
首次构建 body
触发 onAppear
等待状态变化
重新计算 body
触发 onChange
触发 onDisappear
视图销毁

四、实际应用场景

1. 数据加载模式
struct UserProfileView: View {@State private var user: User?@State private var isLoading = falsevar body: some View {Group {if isLoading {ProgressView()} else if let user {ProfileContentView(user: user)} else {Text("用户数据加载失败")}}.task {await loadUserData()}}private func loadUserData() async {isLoading = truedefer { isLoading = false }do {user = try await NetworkService.fetchUserProfile()} catch {print("加载失败: \(error)")}}
}
2. 资源管理
struct VideoPlayerView: View {let player = AVPlayer()var body: some View {VideoPlayer(player: player).onAppear {player.play()}.onDisappear {player.pause()player.replaceCurrentItem(with: nil)}}
}
3. 状态恢复
struct TimerDemo: View {@State private var elapsed = 0@State private var timer: Timer?var body: some View {Text("\(elapsed) 秒").onAppear { startTimer() }.onDisappear { stopTimer() }.onChange(of: scenePhase) { _, newPhase inif newPhase == .active {startTimer()} else {stopTimer()}}}func startTimer() {timer?.invalidate()timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ inelapsed += 1}}func stopTimer() {timer?.invalidate()timer = nil}
}

五、最佳实践与注意事项

避免在 body 中执行副作用

// ❌ 错误做法
var body: some View {let _ = print("这会被频繁调用!")Text("Hello")
}// ✅ 正确做法
var body: some View {Text("Hello").onAppear { print("只调用一次") }
}

使用 .task 替代 onAppear + Task

// ✅ 推荐 (自动取消)
.task { await loadData() }// ❌ 不推荐 (需手动管理)
.onAppear {Task { await loadData() }
}

合理使用状态标识防止重复加载

@State private var isLoaded = false.task {guard !isLoaded else { return }await loadData()isLoaded = true
}

深层状态变化优化

// 使用引用类型优化复杂状态
class UserModel: ObservableObject {@Published var details: UserDetails?@Published var friends: [User] = []
}struct ProfileView: View {@StateObject var model = UserModel()var body: some View {// ...}
}

调试生命周期

struct LifecycleTracker: ViewModifier {let name: Stringfunc body(content: Content) -> some View {content.onAppear { print("\(name) appeared") }.onDisappear { print("\(name) disappeared") }}
}// 使用
Text("测试").modifier(LifecycleTracker(name: "文本视图"))

六、与 UIKit 生命周期对比

生命周期事件SwiftUIUIKit
初始化init()init(coder:)
首次加载body计算 + .onAppearviewDidLoad()
即将显示无直接等效viewWillAppear(_:)
显示完成.onAppearviewDidAppear(_:)
即将消失无直接等效viewWillDisappear(_:)
完全消失.onDisappearviewDidDisappear(_:)
状态变化响应@State+ body 重计算setNeedsLayout()
内存警告无直接等效didReceiveMemoryWarning
布局变化.onChange(of: size)viewWillLayoutSubviews

SwiftUI 的生命周期管理更加声明式自动化,开发者只需关注状态变化和关键生命周期事件,框架会自动处理视图的创建、更新和销毁。


文章转载自:

http://4rgLi6xk.fswmL.cn
http://nyM5XOAl.fswmL.cn
http://cTnJ34rz.fswmL.cn
http://AOCI0Q7q.fswmL.cn
http://mKXXW8Us.fswmL.cn
http://SPH5E0zM.fswmL.cn
http://fGR8SkFC.fswmL.cn
http://dcA9ieZv.fswmL.cn
http://v66hydOs.fswmL.cn
http://53edYkGA.fswmL.cn
http://gTssievA.fswmL.cn
http://nLdl0TUL.fswmL.cn
http://icOgnzRa.fswmL.cn
http://jpeWM5rM.fswmL.cn
http://IY4BaaVx.fswmL.cn
http://ZytJnxPm.fswmL.cn
http://TJ7VsflI.fswmL.cn
http://FpNzsBdU.fswmL.cn
http://RxC4RFd4.fswmL.cn
http://3yARb78S.fswmL.cn
http://zM2pSOc9.fswmL.cn
http://H2eEOjyT.fswmL.cn
http://UwHJNfGp.fswmL.cn
http://oISVsMyQ.fswmL.cn
http://mmwXZyzm.fswmL.cn
http://nDAuuUQI.fswmL.cn
http://45fsEtvz.fswmL.cn
http://k257xVZS.fswmL.cn
http://LKTjKP33.fswmL.cn
http://EDFwmqui.fswmL.cn
http://www.dtcms.com/wzjs/682896.html

相关文章:

  • 长春火车站有几个园洲做网站公司
  • 学做网站论坛视频下载创建网站选哪家好
  • 巴中网站建设网站推广温州专业网站建设推广
  • 大良陈村网站建设河北中保建设集团网站首页
  • 网站收录工具看别人的wordpress
  • 网站建设前期规划网站开发流程包括
  • 电子商务网站经营特色分析的主要内容包括四川省建设安全管理协会网站
  • 点击图片是网站怎么做桂林人论坛app
  • 网站建设与制作 试卷与答案网页设计图标素材
  • 云免网站空间企业网络费用一年多少钱
  • 如何将网站的关键词排名优化网站备案代码
  • 多个网站给一个网站推广汉川网站制作
  • 电子政务门户网站建设汇报发布一个网站要多少钱
  • 怎么自己做视频网站登录页面设计图片
  • 自建网站平台的页面功能wordpress文件权限
  • 甘谷县建设局网站整合营销的最高阶段是
  • 网站商城前台模板免费下载做一套vi设计要多少钱
  • 中小企业网站建设新闻wordpress怎么在主题上更改
  • 做网站报价表怎么建立网站文件夹
  • 做演示的网站wordpress 条件筛选
  • 校园网站建设的目的网站制作例子
  • 坑梓网站建设价格开个捕鱼网站怎么做
  • 兰州做网站价格网站模板预览与编辑器
  • 怎么做网站301重定向网站用户权限
  • 做网站容易找工作吗网站注册页面设计
  • 网站建设犭金手指六六壹柒网站建设最重要的环节
  • 网站建设的快乐石家庄新闻综合频道在线直播回放
  • 建设银行网站为什么打不开广告传媒公司简介
  • 想学做网站要去哪里学手机视频网站建站
  • 购物网站开发背景做网站需要每年都缴费吗