小程序setData函数小探究

article/2025/8/27 2:45:05

官方文档可以知道

这里写图片描述

setData函数改变Page的data是同步的,会异步通知视图层data的改变,视图层收到通知后进行渲染。即官方文档里生命周期的Send Data箭头

callback分析

先上代码:

Page({data: {theData: 1},onLoad: function(options) {console.log("data begin:" + this.data.theData);this.setData({theData: 2}, () => {console.log("callback");});console.log("data after:" + this.data.theData);/*长耗时*/for (var i = 0; i < 1000000; i++) {for (var j = 0; j < 2000; j++) {j++;}}console.log("data long after:" + this.data.theData);}
})

结果:
这里写图片描述
结果描述:data begin:1与data after:2瞬间就打印,并且页面也瞬间显示完成,随后过几秒后data long after才打印,并且紧接着callback也打印了。

结论
1、逻辑层是单线程,视图层的回调callback是异步代码段,因此逻辑层的高耗时代码段执行完成后,异步代码段才会执行。(其实就是js引擎就是单线程,没啥好结论的[捂脸][捂脸])
2、setData函数是同步方法,使用serData后,data对象的值就是修改后的,后面的代码取出的data就是修改后的,可以放心处理不必担心出现异步问题。

callback再分析:

setData后,逻辑层会通知视图层data改变了,随后视图层会进行渲染。
在这里插入图片描述

渲染是需要耗时的,这里猜测一下:callback是在逻辑层通知视图层成功后就立即调用,还是在视图层渲染成功后才通知逻辑层调用callback?(即是在1处执行callback还是在2处执行callback?)

先上代码:

Page({data: {colorMap: [],count: 0},onLoad: function() {},change: function() {var columnAmount = 75;var rowAmount = 200;var colorMap = [];//这里随机生成1~5数字,用于前端随机展示5种不同的颜色块,颜色块共200*75个//所以视图层渲染起来会比较慢for (var i = 0; i < rowAmount; i++) {colorMap[i] = [];for (var j = 0; j < columnAmount; j++) {colorMap[i][j] = Math.ceil(Math.random() * 5);}}var that = this;console.log("begin setData")this.setData({//注意该setData会导致视图层较高耗时colorMap: colorMap}, () => {that.data.count++;console.log("callback", that.data.count)if (that.data.count < 5) {that.change();}});}
});
<view class='mycontainer'><view wx:for="{{colorMap}}" class="row" wx:for-item="rowitem"><view wx:for="{{rowitem}}" class='box color{{boxitem}}' wx:for-item="boxitem"></view></view><button bindtap="change">change</button>
</view>
.mycontainer{width: 100%;height: 100%;
}
.box{width: 10rpx;height: 10rpx;float: left;
}
.row{width: 100%;height: 10rpx;
}
.color1{background-color: red;}
.color2{background-color: yellow;}
.color3{background-color: rgb(47, 179, 255);}
.color4{background-color: cyan}
.color5{background-color: orange;}

结果:
在这里插入图片描述

结果描述:
点击change后:
1、迅速打印出begin setData
2、然后等了大约半秒
3、模拟器出现随机颜色块,同时控制台打印出callback
4、重复了1~3一共5次

代码可以看出,主要的耗时是在视图层的渲染里的,如果是逻辑层通知视图层成功后就执行callback,那么应该是先打印callback,然后大约半秒,模拟器才出现随机颜色块。因此得出下面结论:

结论:
逻辑层执行setData后,视图层进行渲染,渲染成功后,逻辑层的callback才会被调用。

小结:因此对于要求必须渲染成功后才允许执行某代码块的场景,可以放心使用setData的callback方法。


http://chatgpt.dhexx.cn/article/tWv1wFSf.shtml

相关文章

微信小程序中this.setData is not a function报错问题

微信小程序中this.setData is not a function报错问题 新手在编写小程序时经常会遇到的一种错误。 新手在编写小程序时经常会遇到的一种错误。 在小程序中&#xff0c;通常我们用setData修改数据&#xff0c;用于函数时不会报错。 eg. setData function(e){this.setData({mob…

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

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

微信小程序setData()方法的使用

官方解释: setData 函数用于将数据从逻辑层发送到视图层&#xff08;异步&#xff09;&#xff0c;同时改变对应的 this.data 的值&#xff08;同步&#xff09;。 自己通俗的理解就是给数据复制用的, 结合一个demo说下setdata的使用 不如点击确定按钮把当前的值显示的布局中…

android setdata方法,Android intent.setData方法

1 从文本框中获取内容 EditText mobileText (EditText)findViewById(R.id.mobile); String mobile mobileText.getText().toString(); 2 打电话的权限 在功能清单中加入代码 编写代码实现Button的点击相应 Intent intent new Intent(); intent.setAction("android.inte…

微信小程序中 setData 详解

虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号&#xff08;ID&#xff1a;itclanCoder&#xff09; 如果不知道如何操作 点击这里,标星不迷路 ━━━━━━ ━━━━━━…

微信小程序————setData()方法的使用和注意事项

微信小程序setData()使用&#xff1a; ##Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层&#xff08;异步&#xff09;&#xff0c;同时改变对应的 this.data 的值&#xff08;同步&#xff09;。 参数说明&#xff1a; …

微信小程序setData注意事项,使用方法

1..微信小程序开发中&#xff0c;为了减少data和视图层数据表现不一致&#xff0c;全部采用setData方法修改值。 setData函数注意事项 1..直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的&#xff0c;还会造成数据不一致。 2..单次设罟的数据不能超过1024kB&…

layui自定义table中的templet

1.效果图如下 2.后端返回数据如下 3.实现代码如下 {field: "triggerPara",title: "触发参数",templet: function (d) {let text"" , type;for(let i 0 ; i < d.triggerPara.length ; i ){if(d.triggerPara[i].type 0){type 门禁}else i…

layui table 更新行触发templet重新渲染

更新方法 obj.update({// 这里的字段必须要在 table.render.cols.filed 有定义&#xff0c;否则无法触发表格渲染// key 决定是否重新渲染某一列&#xff0c;value 由 templet 里的语句进行逻辑处理canView: !data.canView }); , {field: canView, title: 操作, toolbar: #te…

layui2.4.5版本解决table使用templet导出数据问题

在使用 table 自带的导出功能时对使用了templet的数据导出为空 使用较高的版本可以解决此类问题&#xff1a;https://gitee.com/layui/layui/issues/I40UJ9 但是此文章中的项目比较老以及页面功能都比较多升级layui版本可能会影响比较大&#xff0c;所以就对layui源码进行微调…

layui表格使用自定义模板templet

前言 在前文 layuispringboot实现表格增删改查 中&#xff0c;我们展示了如何使用layui将数据库数据渲染到前端表格中&#xff0c;但现在问题来了&#xff0c;如果不加特殊处理&#xff0c;前端表格直接显示数据库存储信息是不合适的&#xff0c;例如数据库有一个类型字段&…

layui 动态表格 templet模板函数

1&#xff0c;需求说明 关于动态标题栏的相关知识跳转链接&#xff1a;layui 静态 动态复杂多表头 2&#xff0c;尝试的用法 var chenbenkemuList${chenbenkemuList};var columnAry[]for (var i 0; i < chenbenkemuList.length; i) {var onechenbenkemu chenbenkemuList[…

layui:templet

在使用layui-table的时候,由于它每次都是动态刷新,无法保存我们做的一些页面上元素的修改。 我希望我设置完默认地址之后,下次访问应该是和这次一样变成了灰色的。 这个时候要用到templet,官方文档中的{{d}}就是table获取回来的data,直接做判断,设置样式即可! <

LayUi 之 templet

templet是什么东西&#xff1f; 我们都知道LayUi中有模板&#xff0c;就是把我们需要展示的东西放在模板中展示&#xff0c;你就比如我们想要展示一些数据&#xff0c;但是这些数据不是我们想要的数据或者不是我们想要的样子&#xff0c;这个时候我们可以通过模板前端更改一下…

Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释

一、线程5种状态 1.新建状态&#xff08;New&#xff09; 新创建了一个线程对象。 2.就绪状态&#xff08;Runnable&#xff09; 线程对象创建后&#xff0c;其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中&#xff0c;变得可运行&#xff0c;等待获取C…

java线程状态(六种五种)

java线程的状态常见的有两种说法&#xff0c;一种是将其分为6种一种是分为5种 1. 六种&#xff1a; 划分依据&#xff1a;主要是从java代码的角度来进行划分。 1. 新建状态 &#xff1a; 使用new关键字创建一个thread对象&#xff0c;刚刚创建出的这个线程就处于新建状态。在…

统计Java进程中的线程状态(jstack+linux)

统计Java进程中的线程状态 第一步&#xff1a;查看Java进程ID 第二步&#xff1a;使用jstack命令dump线程信息&#xff0c;看看pid45890进程中的线程都是什么状态 /usr/local/java/jdk1.8.0_144/bin/jstack 84976 >/opt/test.dump第三步&#xff1a;统计所有线程分别处于什…

线程状态图

1. 新建状态(New) : 线程对象被创建后&#xff0c;就进入了新建状态。例如&#xff0c;Thread thread new Thread()。 2. 就绪状态(Runnable): 也被称为“可执行状态”。线程对象被创建后&#xff0c;其它线程调用了该对象的start()方法&#xff0c;从而来启动该线程…

Java 线程状态之 TIMED_WAITING

定义 一个正在限时等待另一个线程执行一个动作的线程处于这一状态。 A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state. 更详细的定义还是看 javadoc&#xff08;jdk8&#xff09;&#xff1a; 带指定…