swiftui - @State 的限制
问题描述
我在一些文章中看到@state 有很多限制
- 我们不应该将它与复杂的模型一起使用,而最好将它与字符串、布尔值等简单属性一起使用。
- 我们应该在视图本身中使用它。
我尝试制作一个结构模型并在内容视图(ParentView)中用@state 标记它,并通过用@binding 包装它来将此模型传递给它的子视图,它工作得很好,所以我不明白为什么我们仍然需要@objectbinding因为我们可以将相同的值传递给这些子视图,如果其中一个发生变化,其他的也会发生变化?或者@objectbinding 解决的@state 的限制是什么?
解决方案
我建议您观看WWDC 2019 会议:SwiftUI 中的数据流。解释得很好。它描述了在哪些情况下@State 是完全可以接受的,而在哪些情况下需要 ObjectBinding/EnvironmentObject。会议只有 37 分钟,但它将是您对绑定的理解的前后。请务必观看,从长远来看,它将节省时间。
这一切都归结为了解数据的“真相来源”在哪里。这也是视频中解释的概念。简而言之,事实的来源是您的数据诞生了。如果你的变量的数据可以从其他变量中导出,那么它就不是事实的来源。
@State
和 和有什么不一样@BindableObject
?
@State
: 它是本地视图。它必须是值类型(例如,结构、整数、字符串、数组等),并且其存储由框架管理。
@BindableObject
:它在视图之外,它是一个参考值(例如,一个类),它的存储由您管理,让您更灵活地实现自己的逻辑。
请注意,@State
在为您的应用程序制作原型时,变量也很棒。例如,如果您正在处理视图的布局,则最初可以使用@State
变量来使事情变得更容易。一旦您的视图实现了您想要的,您就可以专注于创建@BindableObject
和替换您的@State
.
推荐阅读
- java - 哪些版本的 Kotlin 与哪些版本的 JDK 兼容?
- android - 无法实例化 PlaceAutocomplete
- scala - 映射列表时使用归纳结构的Scala案例匹配失败
- javascript - 在 React 中使用 axios 下载单个文件为 pdf 和多个文件为 zip
- python - 为 pandas 中的每个类按平均值查找具有代表性的观察值
- api - 使用 curl 发布“使用错误/非法格式或缺少 URL”
- python - 如何在networkx图中显示连接列表?
- mysql - 如何添加一个mysql列值作为where查询条件的关键字?
- mysql - 如何在 SQL 中正确插入 CSV 文件?
- reactjs - 如何从 React Native 中的子组件访问父级中的多个状态