跳到主要内容
版本:0.83

🗑️ InteractionManager

已废弃

避免长时间运行的工作,改用 requestIdleCallback

InteractionManager 允许将长时间运行的工作安排在任何交互/动画完成后执行。特别是,这使得 JavaScript 动画能够平滑运行。

应用可以使用以下方式安排任务在交互结束后运行:

React TSX
InteractionManager.runAfterInteractions(() => {
// ...长时间运行的同步任务...
});

将其与其他调度替代方案进行比较:

  • requestAnimationFrame() 用于随时间为视图添加动画的代码。
  • setImmediate/setTimeout() 稍后运行代码,注意这可能会延迟动画。
  • runAfterInteractions() 稍后运行代码,而不会延迟正在进行的动画。

触摸处理系统将一个或多个活动触摸视为一次“交互”,并会将 runAfterInteractions() 回调延迟到所有触摸结束或被取消之后。

InteractionManager 还允许应用通过在动画开始时创建一个交互“句柄”,并在完成时清除它来注册动画:

React TSX
const handle = InteractionManager.createInteractionHandle();
// 运行动画...(`runAfterInteractions` 任务会进入队列)
// 之后,在动画完成时:
InteractionManager.clearInteractionHandle(handle);
// 如果所有句柄都已清除,则排队的任务会运行

runAfterInteractions 接受一个普通回调函数,或者一个带有 gen 方法且该方法返回 PromisePromiseTask 对象。如果提供了 PromiseTask,那么在开始执行可能先前同步排队的下一个任务之前,它会被完全解析(包括那些同样通过 runAfterInteractions 安排更多任务的异步依赖)。

默认情况下,排队的任务会在一个 setImmediate 批次中一起循环执行。如果调用 setDeadline 并传入一个正数,那么任务只会执行到接近截止时间(以 js 事件循环运行时间计)为止,此时执行会通过 setTimeout 让出,从而允许诸如触摸之类的事件开始交互并阻止排队任务执行,使应用更具响应性。


示例

基础

进阶

参考

方法

runAfterInteractions()

React TSX
static runAfterInteractions(task?: (() => any) | SimpleTask | PromiseTask);

安排一个函数在所有交互完成后运行。返回一个可取消的“promise”。


createInteractionHandle()

React TSX
static createInteractionHandle(): Handle;

通知管理器某个交互已经开始。


clearInteractionHandle()

React TSX
static clearInteractionHandle(handle: Handle);

通知管理器某个交互已经完成。


setDeadline()

React TSX
static setDeadline(deadline: number);

一个正数会使用 setTimeouteventLoopRunningTime 达到截止值后调度任何任务,否则所有任务都会在一个 setImmediate 批次中执行(默认)。