为什么自定义 SwiftUI 视图不对状态变化做出反应
Why doesn't custom SwiftUI view react to state changes
我在 SwiftUI 中遇到过许多不同自定义视图的问题,那么为什么
struct HeaderText: View {
@State var text: String
@State var color: Color
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
不会在 text
或 color
更改时自动更新。例如,如果我有一个视图
struct ContentView: View {
@State var text = "Hello"
var body: some View {
VStack {
HeaderText(text: self.text, color: .black)
Button("Change Text") {
self.text = "Goodbye"
}
}
}
}
我原以为视图会更新为新文本,但事实并非如此。我知道您可以使用 @Binding
来完成此操作,但我正在寻找更优雅的解决方案,类似于 Text
的工作方式。我只是以这些视图和 structs
为例,所以我知道这些可能不是一般的最佳做法。
感谢您的帮助!
SwiftUI 是一个函数式编程的东西。 Struct
s 是值类型(不是引用类型)。结构通常是不可变的。
您可以在子视图结构中简单地包含 let
。
Why - SwiftUI 在 @State
更改时重新创建您的视图而不是修改它。这是通过再次调用 body
来完成的。
struct HeaderText: View {
let text: String //<= here
let color: Color //<- here
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
为什么问题中的代码不起作用,
这是因为这些状态变量初始化为给定值(在父视图内)以及未对子视图(HeaderText)内的 @state
所做的更改 因为 @State
可以在视图本身内部进行更改。
我在 SwiftUI 中遇到过许多不同自定义视图的问题,那么为什么
struct HeaderText: View {
@State var text: String
@State var color: Color
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
不会在 text
或 color
更改时自动更新。例如,如果我有一个视图
struct ContentView: View {
@State var text = "Hello"
var body: some View {
VStack {
HeaderText(text: self.text, color: .black)
Button("Change Text") {
self.text = "Goodbye"
}
}
}
}
我原以为视图会更新为新文本,但事实并非如此。我知道您可以使用 @Binding
来完成此操作,但我正在寻找更优雅的解决方案,类似于 Text
的工作方式。我只是以这些视图和 structs
为例,所以我知道这些可能不是一般的最佳做法。
感谢您的帮助!
SwiftUI 是一个函数式编程的东西。 Struct
s 是值类型(不是引用类型)。结构通常是不可变的。
您可以在子视图结构中简单地包含 let
。
Why - SwiftUI 在 @State
更改时重新创建您的视图而不是修改它。这是通过再次调用 body
来完成的。
struct HeaderText: View {
let text: String //<= here
let color: Color //<- here
var body: some View {
Text(text)
.font(.custom("Gilroy-SemiBold", size: 20))
.foregroundColor(color)
}
}
为什么问题中的代码不起作用,
这是因为这些状态变量初始化为给定值(在父视图内)以及未对子视图(HeaderText)内的 @state
所做的更改 因为 @State
可以在视图本身内部进行更改。