为什么小程序data定义变量,方法中再定义与其相同值的变量进行存储,后赋值给setData(),为什么不能直接赋值到data中,而是再定义其他变量与data中的值一样,再进行逻辑处理,再赋值到setData()中?
验证如下:
(1)第一种是直接data中的数据进行逻辑处理
得出结果:
(2)第二种是在方法中再定义一个与data中相同值的变量 进行处理
得出结果:
得出:两种方法都是得出结果为2,但是第一种直接操作data中的数据,要每次判断,逻辑处理时就要this.setData()一次,每处理一次就要赋值更新一次数据;第二种虽然在方法中定义相同的值,但是可以在逻辑处理完后再赋值到setData(),达到一次性处理逻辑,再更新数据,减少资源的消耗并且代码简洁,逻辑清晰
总结:第一种频繁请求setData(),第二种则处理完逻辑之后,再请求setData()进行赋值
这也是为什么在方法中写相同data中的值的原因,方法直接调用其相同值,处理逻辑,最后一次性赋值给setData()
常见的setData操作错误(官方文档)
1.频繁的去setData
在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:
(1)Android 下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为 JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
(2)渲染有出现延时,由于WebView 的 JS 线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;
2.每次setData都传递大量新数据
由setData的底层实现可知,我们的数据传输实际是一次evaluateJavascript脚本过程,当数据量过大时会增加脚本的编译执行时间,占用WebView JS线程。
3.后台态页面进行setData
当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。
setData原理图: