Taro 更新数据的原理

438 阅读2分钟

Taro设置数据方式

Taro在开发小程序时,底层是基于小程序本身的功能来实现的,只是在小程序基础上加了一层类似应用层的东西。拿React开发来举例,当我们执行setState更新数据时,最终渲染到小程序,还是会调用小程序的setData API进行数据更新。

我们这里要说的,就是指的Taro中更新数据之后,调用小程序setData的数据处理方式。

相对于原生的微信小程序,TarosetData设置数据,包含了节点的信息(节点的类型、class、其他属性等等),而微信小程序中只会set data中的数据。所以Taro中,DOM结构越复杂,setData中的数据量就会越大,也会更容易遇到性能问题。

这是由于 Taro 的渲染机制导致的:原生小程序可以从本地直接取数据渲染,但 Taro 会把数据通过 React/Vue 渲染成一颗 VDOM 树,然后将这颗 VDOM 树序列化之后交给小程序渲染。

一个例子

下面根据选择城市页面举例,页面初始化 和 列表赋值 时,setData设置的数据内容分别是什么?

页面初始化时

会基于初始state数据,进行页面的初始化data设置,包括初始化的节点信息。setData设置内容截图如下:

t1.png

数据更新时

会根据更新的数据内容,再次进行指定数据的setData,如果有新渲染的节点,也会一起设置。

例1: 接口调用完成后,加载列表

t2.png

例2: 修改了具体的某个state数据

t3.png

页面最终的数据

在进行页面初始化以及接口调用完成列表赋值后,最终整个页面的数据内容如下:

t4.png

小结

可以看到不同于原生小程序中,除了用户渲染的state数据,setData 的数据内容还包含了页面的所有节点信息。所以Taro中,DOM结构越复杂,setData中的数据量就会越大,也会更容易遇到性能问题。

当我们遇到性能问题时,也可以从这方面着手看看。适当的减少DOM结构的复杂性,是有助于性能提升的。

《Taro UI 的 Indexes 索引选择器存在问题及优化点》 这篇文章中,可以看到Taro UI中的这个组件就是由于DOM结构的过于复杂,导致setData的数据量超大,2000条数据就达到了1M多的数据量,造成卡顿。

参考