小程序中this.setData的使用和注意事项


Posted in Javascript onAugust 28, 2019

前言:微信小程序中经常需要用到this.setData({})把变量值渲染到视图层,那到底什么是this.setData,如何使用?需要注意哪些?作为一个初学者,分享一点我的经验,希望大家批评指正。

介绍:setData函数主要用于将逻辑层数据发送到视图层,同时对应的改变this.data.x的值。

参数:Object 以 key : value 的形式表示,将 this.data 中的 key 对应的值改变成 value。

使用:先给出代码,wxss没有什么意义就不贴了

index.wxml

<view class="numview">test01======={{test01}}</view>
 <view class="numview">test02======={{test02}}</view>
 <button bindtap="testfun">测试</button>

index.js

Page({
 data: {
  test01: 1,
  test02: 2
 },
 testfun: function() {
  var that = this;
  if (this.data.test01 == 1) {
   that.setData({
    test02:8
   })
   console.log(this.data.test02)
  }
 },
 onLoad: function() {},
})

此时经过编译后模拟器的显示:

 小程序中this.setData的使用和注意事项

这里都容易理解,当点击了button按钮后,触发点击事件执行testfun函数,将test02设置为8,如图:

小程序中this.setData的使用和注意事项

通过this.data.test02=8这种方式直接赋值可以吗,答案是不可以,看下面:

小程序中this.setData的使用和注意事项

使用this.data.test02=10的结果不会渲染到前台页面中显示,但是后台已经改变,会造成前后台数据不一致。

我又想到是不是可以先通过this.data.test02=10赋值,再通过this.setData渲染呢?

onLoad: function() {
  this.data.test02 = 10;
  this.setData({
   test02
  })
 }

编译报错:test02 is not defined;

为什么呢?再进行一项测试:

onLoad: function() {
   this.data.test02 = 10;
   var test03 = 20;
   this.setData({
    test03
   })
   console.log(this.data.test03)
  }

编译后显示:

小程序中this.setData的使用和注意事项

发现了什么?我个人觉得是这样的:

一、this.setData中设置的key如果只有key没有value,则从所在函数内找这个变量,找到之后渲染到前台指定位置。

 (1)如果Page对象的data中没有定义该key,则setData自动创建,这个可以从打印结果中发现(this.data.test03,data中没有定义)。

 (2)如果Page对象的data中已经定义该变量,则修改data中原变量的值。

二、this.setData中设置的key如果有key有value,直接渲染到前台并修改原data中的数据。

注意事项:

上面演示的使用说明也算是注意事项吧,理解透彻才能运用自如,避免数据混乱。

另外给出官方的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的使用和注意事项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript 密码强度判断代码
Sep 05 Javascript
Javascript倒计时页面跳转实例小结
Sep 11 Javascript
jquery使用remove()方法删除指定class子元素
Mar 26 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
JS 实现可停顿的垂直滚动实例代码
Nov 23 Javascript
Vue实现购物车场景下的应用
Nov 27 Javascript
JavaScript实现表单注册、表单验证、运算符功能
Oct 15 Javascript
mpvue开发音频类小程序踩坑和建议详解
Mar 12 Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 Javascript
微信小程序 可搜索的地址选择实现详解
Aug 28 #Javascript
vue实现标签云效果的方法详解
Aug 28 #Javascript
微信小程序通过js实现瀑布流布局详解
Aug 28 #Javascript
TypeScript类型声明书写详解
Aug 28 #Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 #Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 #Javascript
Vue的编码技巧与规范使用详解
Aug 28 #Javascript
You might like
解析php5配置使用pdo
2013/07/03 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
初探jquery——表单应用范例
2007/02/20 Javascript
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
vue项目中使用vue-layer弹框插件的方法
2020/03/11 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
pytorch之添加BN的实现
2020/01/06 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Python中Yield的基本用法
2020/10/18 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
2021/02/24 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
外包公司软件测试工程师
2014/11/01 面试题
装饰施工员岗位职责
2015/04/11 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
方法汇总:Python 安装第三方库常用
2022/04/26 Python