SwiftUI学习之state和Binding的区别浅析

来自:互联网
时间:2021-03-28
阅读:

@state 绑定值的状态,其属性的修饰官方推荐使用private.上代码(ps:这里没用private 进行修饰,是为了演示区别)
import SwiftUI

struct FilterView: View {
// @Binding var isFavorite: Bool
 @State var isFavorite = true
 
 var body: some View {
  Toggle(isOn: $isFavorite) {
   
  }
  let buttonTitle = isFavorite ? "呕吼" : "顿顿"
  Text(buttonTitle)
  
 }
}
struct ProductView: View {
 var titleS: String
 
 //:不想让外部访问的变量 需要初始化
 @State private var changeButtonTtile = true
 var body: some View {
  Button (action: {
   changeButtonTtile.toggle()
  }) {
   let buttonTitle = changeButtonTtile ? "哈哈哈" : "啦啦啦啦"
   Text(buttonTitle)
   FilterView(isFavorite: changeButtonTtile)

  }
 }
}

这里我们看到 @State  var isFavorite = true通过state 进行修饰.这个时候我们点击FilterView的开关 我们只能刷新当前FilterView的界面.注意这里:FilterView(isFavorite: changeButtonTtile) 初始化传入的是changeButtonTtile的value,也就实际值.

下面我们把State注释掉 ,打开@Bingding 那一行

import SwiftUI

struct FilterView: View {
 @Binding var isFavorite: Bool
// @State var isFavorite = true
 
 var body: some View {
  Toggle(isOn: $isFavorite) {
   
  }
  let buttonTitle = isFavorite ? "呕吼" : "顿顿"
  Text(buttonTitle)
  
 }
}
struct ProductView: View {
 var titleS: String
 
 //:不想让外部访问的变量 需要初始化
 @State private var changeButtonTtile = true
 var body: some View {
  Button (action: {
   changeButtonTtile.toggle()
  }) {
   let buttonTitle = changeButtonTtile ? "哈哈哈" : "啦啦啦啦"
   Text(buttonTitle)
   FilterView(isFavorite: $changeButtonTtile)
//:注意这里的取值 变成了$
  }
 }
}

这里我们运行代码,点击开关,你发现了什么??.ProductView 的UI 也发生了变化.这个时候FilterView 传入的是changeBtnTitle的引用,而不是值.这样你在子视图改变@Binding修饰的值,父视图也会跟着刷新.

使用小结

当自定义视图的数据需要外部传入的时候, 使用普通的属性 当自定义的视图需要通过数据变化更新视图时, 对普通属性加上@State修饰 当自定义的视图需要将视图的变化表现在数据的变化时,对普通属性加上@Binding修饰, @Binding 包含了@State的功能, 但一般不会去对@Binding属性做修改
返回顶部
顶部