微信小程序性能优化 ==== 合理使用 setData & 纯数据字段

 

目录

1. setData 的流程

2. 数据通信

3. 使用建议

3.1 data 应只包括渲染相关的数据

3.2 控制 setData 的频率

3.3 选择合适的 setData 范围

3.4 setData 应只传发生变化的数据

3.5 控制后台态页面的 setData

纯数据字段

组件数据中的纯数据字段

组件属性中的纯数据字段

使用数据监听器监听纯数据字段

非data vs 纯数据字段

 总结


setData 是小程序开发中使用最频繁、也是最容易引发性能问题的接口。

1. setData 的流程

setData 的过程,大致可以分成几个阶段:

  • 逻辑层虚拟 DOM 树的遍历和更新,触发组件生命周期和 observer 等;
  • 将 data 从逻辑层传输到视图层;
  • 视图层虚拟 DOM 树的更新、真实 DOM 元素的更新并触发页面渲染更新。

2. 数据通信

对于第 2 步,由于小程序的逻辑层和视图层是两个独立的运行环境、分属不同的线程或进程,不能直接进行数据共享,需要进行数据的序列化、跨线程/进程的数据传输、数据的反序列化,因此数据传输过程是异步的、非实时的

iOS/iPadOS/MacOS 上,数据传输是通过 evaluateJavascript 实现的,还会有额外 JS 脚本解析和执行的耗时。

数据传输的耗时与数据量的大小正相关,如果对端线程处于繁忙状态,数据会在消息队列中等待

  • 小程序的逻辑层和视图层是两个独立的运行环境,它们之间的数据传输是异步的、非实时的。
  • 数据传输的耗时与数据量的大小正相关。

3. 使用建议

3.1 data 应只包括渲染相关的数据

setData 应只用来进行渲染相关的数据更新。用 setData 的方式更新渲染无关的字段,会触发额外的渲染流程,或者增加传输的数据量,影响渲染耗时。

  • ✅ 页面或组件的 data 字段,应用来存放和页面或组件渲染相关的数据(即直接在 wxml 中出现的字段);
  • ✅ 页面或组件渲染间接相关的数据可以设置为「纯数据字段」,可以使用 setData 设置并使用 observers 监听变化;
  • ✅ 页面或组件渲染无关的数据,应挂在非 data 的字段下,如 this.userData = {userId: 'xxx'}
  • ❌ 避免在 data 中包含渲染无关的业务数据;
  • ❌ 避免使用 data 在页面或组件方法间进行数据共享
  • ❌ 避免滥用 纯数据字段 来保存可以使用非 data 字段保存的数据。

3.2 控制 setData 的频率

每次 setData 都会触发逻辑层虚拟 DOM 树的遍历和更新,也可能会导致触发一次完整的页面渲染流程。过于频繁(毫秒级)的调用 setData,会导致以下后果:

  • 逻辑层 JS 线程持续繁忙,无法正常响应用户操作的事件,也无法正常完成页面切换;
  • 视图层 JS 线程持续处于忙碌状态,逻辑层 -> 视图层通信耗时上升,视图层收到消息的延时较高,渲染出现明显延迟;
  • 视图层无法及时响应用户操作,用户滑动
### 微信小程序 Modal 弹窗无法关闭解决方案 在微信小程序开发过程中,遇到 `modal` 弹窗无法正常关闭的情况通常是因为数据绑定或事件处理函数存在问题。以下是具体分析和解决方案: #### 1. 数据绑定问题 确保页面的数据属性 `showAssignModal` 正确反映了弹窗的状态变化。如果该变量未被更新,则即使触发了关闭操作,弹窗也不会消失。 ```javascript Page({ data: { showAssignModal: true, }, hideModal() { this.setData({ showAssignModal: false }); } }); ``` 上述代码展示了如何通过设置 `setData()` 方法来改变 `showAssignModal` 的值从而控制弹窗显示状态[^1]。 #### 2. 组件配置错误 确认是否已按照官方文档正确注册并使用了自定义组件。对于全局自定义弹窗,在 `app.json` 中声明 `"usingComponents"` 字段,并指定路径指向实际存在的文件位置。 ```json { "usingComponents": { "model": "/components/model/index" } } ``` 同时,在 WXML 文件里也要相应地引用此组件标签名 `<model>` 而不是默认的 `<modal>` 标签[^4]。 #### 3. 事件监听器缺失或不匹配 检查是否有遗漏绑定必要的点击事件处理器(如 `bindcancel`, `bindconfirm`),以及这些方法内部逻辑是否能有效执行隐藏动作。另外需要注意的是,当使用第三方库时可能需要遵循特定命名约定。 ```html <modal hidden="{{!showAssignModal}}" bindcancel="hideModal" bindconfirm="hideModal"> </modal> ``` 这里给出了一个简单的例子说明怎样利用两个按钮分别调用同一个用于隐藏对话框的方法 `hideModal`。 #### 4. 样式冲突影响交互行为 有时 CSS 样式的不当应用也会干扰到控件的功能表现,特别是涉及到遮罩层透明度、定位方式等方面的内容。建议排查是否存在此类潜在因素导致的问题。 综上所述,要解决微信小程序中的 `modal` 弹窗无法关闭的问题,应该从以上几个方面逐一排查原因并采取相应的措施加以修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端 贾公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值