【卡顿闪退】嵌套使用过多自定义组件会卡顿闪退?
- 需求的场景描述(希望解决的问题)
我们的小程序比较复杂,嵌套使用了很多自定义组件,自定义组件间传递的数据有些是较大的对象。现在发现性能很差,用户经常反馈卡顿闪退,做性能分析的时候提示过多地调用了setData,但其实我们的setData并不多,只是自定义组件层级多而已。
我理解是不是因为自定义组件的数据传递机制有点问题?
举个例子:页面A中使用了自定义组件C1,自定义组件C1中又使用了自定义组件C2 …
自定义组件的数据传递机制是不是这样的:
1、页面A通过调用setData,把A的数据stringify后传递给了页面A的wxml(从js线程 -> 渲染线程)
2、页面A的wxml发现使用了组件C1,于是把要传递给C1的数据parse之后传递给C1的js线程(从渲染线程 -> js线程)
3、组件C1的js接收到数据之后,需要把数据传递给组件C1的wxml,于是又stringify一次(从js线程 -> 渲染线程)
4、组件C1的wxml发现使用了组件C2,于是把要传递给C2的数据parse之后传递给C2的js线程(从渲染线程 -> js线程)
5、组件C2的js接收到数据之后,需要把数据传递给组件C2的wxml,于是又stringify一次(从js线程 -> 渲染线程)
如此类推。。。。。。
我的问题是:
1、我理解的数据传递过程对么,是这样实现的吗?(代码片段里做了个简单的验证,同一份数据传递之后确实不一样了)
2、如果1的假设是对的,那可不可以通过用app.globalData.xx之类的方式来做数据传递呢?要setData的数据放到app.globalData.xx里,然后在自定义组件中去监听app.globalData.xx的变化(js线程 -> js线程),是不是可以节省下一趟的stringify、parse的开销?
3、如果2的假设是对的,getApp的开销有多大,是不是可以忽略不计的?
4、如果上面的假设没错,那这是不是做性能优化的一个思路呢?
