本篇文章给大家分享的是有关在小程序中使用this.setData时需要注意哪些事项,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
介绍:setData函数主要用于将逻辑层数据发送到视图层,同时对应的改变this.data。x的值。
参数:对象以键:值的形式表示,将这个。数据中关键的对应的值改变成价值。
使用:先给出代码,wxs没有什么意义就不贴了
索引。wxml
, & lt; view 类=皀umview"祝辞test01======={{test01}} & lt;/view> ,& lt; view 类=皀umview"祝辞test02======={{test02}} & lt;/view> ,& lt; button  bindtap=皌estfun"在测试& lt;/button>
索引。js
页面({ ,数据:{ test01才能:1, test02才能:2 }, ,testfun:函数(),{ var 才能;that =,; if 才能;(this.data.test01 ==, 1), { ,,that.setData ({ ,,test02:8 ,,}) ,,console.log (this.data.test02) ,,} }, ,onLoad:函数(),{}, })
此时经过编译后模拟器的显示:
,
这里都容易理解,当点击了按钮按钮后,触发点击事件执行testfun函数,将test02设置为8,如图:
通过<代码> this.data。test02=8 代码>这种方式直接赋值可以吗,答案是不可以,看下面:
使用<代码> this.data.test02=10> 代码的结果不会渲染到前台页面中显示,但是后台已经改变,会造成前后台数据不一致。
我又想到是不是可以先通过<代码> this.data.test02=10> 代码赋值,再通过这个。setData渲染呢?
, onLoad:,()函数,{ 时间=this.data.test02 才能;10; this.setData({才能 test02。才能 })才能 以前,}>编译报错:test02不是定义;
为什么呢?再进行一项测试:
,, onLoad:,()函数,{ ,,this.data.test02 =, 10; ,,var test03 =, 20; ,,this.setData ({ ,,test03 ,,}) ,,console.log (this.data.test03) 以前,,}>编译后显示:
发现了什么?我个人觉得是这样的:
一,。setData中设置的关键如果只有关键没有值,则从所在函数内找这个变量,找到之后渲染到前台指定位置。
(1)如果页面对象的数据中没有定义该键,则setData自动创建,这个可以从打印结果中发现(this.data。test03、数据中没有定义)。
(2)如果页面对象的数据中已经定义该变量,则修改数据中原变量的值。
二,this.setData中设置的关键如果有键有值,直接渲染到前台并修改原数据中的数据。
<强>注意事项:强>
上面演示的使用说明也算是注意事项吧,理解透彻才能运用自如,避免数据混乱。
另外给出官方的setData建议:https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips.html
<强>常见的setData操作错误强>
1。频繁的去setData
在我们分析过的一些案例里,部分小程序会非常频繁(毫秒级)的去setData,其导致了两个后果:
Android下用户在滑动时会感觉到卡顿,操作反馈延迟严重,因为JS线程一直在编译执行渲染,未能及时将用户操作事件传递到逻辑层,逻辑层亦无法及时将操作处理结果及时传递到视图层;
渲染有出现延时,由于WebView的JS线程一直处于忙碌状态,逻辑层到页面层的通信耗时上升,视图层收到的数据消息时距离发出时间已经过去了几百毫秒,渲染的结果并不实时;
2。每次setData都传递大量新数据
由setData的底层实现可知,我们的数据传输实际是一次<代码> evaluateJavascript 代码>脚本过程,当数据量过大时会增加脚本的编译执行时间,占用WebView JS线程,
3。后台态页面进行setData
当页面进入后台态(用户不可见),不应该继续去进行setData,后台态页面的渲染用户是无法感受的,另外后台态页面去setData也会抢占前台页面的执行。
在小程序中使用this.setData时需要注意哪些事项