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() 沒有上述任何問題,您可以從任何地方調用它。