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()
没有上述问题,可以在任何地方调用。