redraw()
描述
在应用程序数据层发生变化后,更新 DOM。
如果在 Mithril.js 视图中定义的事件处理程序的执行上下文中修改了数据,或者在使用 m.request 发起请求完成后,不需要调用 m.redraw()。基于 m.redraw() 的 自动重绘 系统会自动处理这些情况。
需要在 setTimeout、setInterval、requestAnimationFrame 的回调函数中,或第三方库的回调函数中调用 m.redraw()。
签名
m.redraw()
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| 返回 | 无返回值 |
静态成员
m.redraw.sync
m.redraw.sync()
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
| 返回 | 无返回值 |
工作原理
当执行 Mithril.js 之外的回调函数时,你需要通知 Mithril.js 的渲染引擎进行重绘。这些外部回调函数可能包括 setTimeout、setInterval、requestAnimationFrame 的回调、WebSocket 库的回调、jQuery 插件中的事件处理函数、第三方 XHR 请求的回调等。
要触发重绘,请调用 m.redraw()。请注意,m.redraw() 只有在使用 m.mount 或 m.route 挂载组件时才有效。如果通过 m.render 渲染,则应该使用 m.render 进行重绘。
m.redraw() 始终触发异步重绘,而 m.redraw.sync() 触发同步重绘。m.redraw() 基于 window.requestAnimationFrame() 实现,因此通常每秒最多触发 60 次。如果显示器的刷新率更高,可能会触发更快的重绘。
m.redraw.sync() 主要用于支持 iOS 中的视频播放功能。它仅在响应由用户触发的事件时才有效。使用它需要注意以下事项:
- 不应从生命周期方法或组件的
view()方法中调用m.redraw.sync()。这样做会导致未定义的行为(如果可能,会抛出错误)。 - 在事件处理函数中调用
m.redraw.sync()可能会导致在事件冒泡阶段修改 DOM。根据新旧 DOM 树的结构差异,事件可能在新 DOM 树中完成冒泡,并触发不必要的事件处理函数。 - 它没有节流机制。每次调用
m.redraw.sync()都会立即为每个通过m.mount()或m.route()注册的根组件调用一次m.render()。
m.redraw() 没有上述问题,可以在任何地方调用。