背景信息
如有频繁用户交互,在小程序上表现是比较卡顿的。例如,页面有 2 个元素 A 和 B,用户在 A 上做 touchmove
手势,要求 B 也跟随移动,movable-view
就是一个典型的例子。一次 touchmove
事件的响应过程为:
-
touchmove
事件从视图层(Webview
)抛到逻辑层(App Service)。 -
逻辑层(App Service)处理
touchmove
事件,再通过setData
来改变 B 的位置。
一次 touchmove
的响应需要经过 2 次逻辑层和渲染层的通信以及一次渲染,通信的耗时比较大。此外,setData
渲染也会阻塞其它脚本执行,导致整个用户交互的动画过程出现延迟。
实现方案
本方案基本的思路是减少通信次数,让事件在视图层(Webview
)响应。小程序的框架分为视图层(Webview
)和逻辑层(App Service)。这样分层的目的是管控,开发者的代码只能运行在逻辑层(App Service),而这个思路就必须要让开发者的代码运行在视图层(Webview
),如下图所示的流程:
使用 SJS 函数用来响应小程序事件,目前只能响应内置组件的事件,不支持自定义组件事件。SJS 函数除了纯逻辑的运算,还可以通过封装好的 ComponentDescriptor
实例来访问以及设置组件的 class<