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