djk3000 / ME

4 stars 2 forks source link

SwiftUI-DataBinding #41

Open djk3000 opened 3 years ago

djk3000 commented 3 years ago

swift的数据状态和绑定我一开始看了一下,现在还是专门写一下记录一下。 数据状态和绑定分为以下几个:@State、@StateObject、@Binding、@ObservedObject、@EnvironmentObject 个人理解: @State -- 内部状态的存储(值类型) @StateObject -- 内部状态的存储(引用类型) @Binding -- 父视图传递给子视图的状态存储 @ObservedObject -- 父视图传递给子视图的状态共享 @EnvironmentObject -- 多个视图间的视图共享 上个代码例子: 父view:

import SwiftUI

struct ContentView: View {
    @State var isClick = false
    @StateObject var user:UserData = UserData()
    @ObservedObject var userData:UserData = UserData()
    @EnvironmentObject var userDataPublic:UserDataPublic

    var body: some View {
        VStack{
            Text("Hello, world?: \(self.isClick ? "Yes":"No")")
                .padding()

            Text("username:\(self.user.userName)")

            Text("usernameObserved:\(self.userData.userName)")

            Text("usernamePublic:\(self.userDataPublic.userName)")

            ChildView(click:$isClick,userName: $userData.userName)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(UserDataPublic())
    }
}

子view:

import SwiftUI

struct ChildView: View {
    @Binding var click:Bool
    @Binding var userName:String
    @StateObject var user:UserData = UserData()
    @EnvironmentObject var userNamePublic:UserDataPublic

    var body: some View {
        VStack{
            Button("click")
            {
                self.click.toggle()
                if(self.click){
                    self.userName = "chenfeng123"
                    self.userNamePublic.userName = "djk123"
                    self.user.userName = "chenfeng000"
                }else{
                    self.userName = "chenfeng456"
                    self.userNamePublic.userName = "djk456"
                    self.user.userName = "chenfeng111"
                }
            }
            Text("username:\(self.user.userName)")
        }
    }
}

struct ChildView_Previews: PreviewProvider {
    static var previews: some View {
        ChildView(click: Binding.constant(false),userName: Binding.constant(""))
            .environmentObject(UserDataPublic())
    }
}

上面包含了所有的应用,我都实验了一下,相互之间view的传值应该一直要用的

chenfeng11 commented 2 years ago

邓兄强啊