课程章节介绍
同学们,今天我们来看看一个很关键、但又经常被忽视的概念,那就是控制器状态和视图状态的区别。尤其是在异步操作里,比如用 Continuation 做长时间调用的时候,这个区别就更明显了。
咱们先打个比方:你可以把控制器状态想像成“操作台”上所有决策者的记忆,而视图状态则是整个“控制室”里所有设备的状态和它们的连线图。
具体来说,第一点,当你在一个页面流程中发起一个 Continuation 异步请求时,请求里面携带的控制器状态,并不是只有发起调用的那个控制器。它会序列化整个请求里涉及的所有控制器——包括控制器扩展,还有那些自定义组件、内部组件里绑定过的控制器。哪怕这个 Continuation 不是你亲手在那个扩展里写的,只要这个请求链路里出现了这些控制器,它们的关键状态都会被一起打包带走。所以,控制器状态是一个“团队记忆”,而不是个人的记忆。
第二点,视图状态比控制器状态要重得多。它不仅保存了每一个组件、每一个控制器属性的状态,还保存了整个页面的组件树结构——也就是哪个组件是父、哪个是子,它们是怎么嵌套在一起的。你可以理解成,控制器状态只是保存了大家脑子里记得的东西,而视图状态不但要记住这些,还画出了整个工位的分布图。
因为视图状态要存的东西多,所以它的体积上限也大一些,最大能到 170 KB。控制器状态相比之下就小得多,但也要特别注意,哪怕是在异步场景里,如果你在请求链路里无意中引用了很多笨重的控制器,它们的状态也会跟着序列化,拖慢性能。
简单总结一下,做 Continuation 的时候,控制器状态是“所有相关控制器的记忆合辑”,而视图状态是“完整的状态加结构全家桶”,上限能到 170 KB。理解这个区别,能帮你更好地优化页面性能,避免那些莫名其妙的状态丢失或者体积超限的问题。
好了,这节课就讲到这儿,大家结合手头的异步场景再体会一下,有什么疑问我们下节继续聊。
关键词
Apex
Salesforce
Developer Guide