2014-12-08 73 views
3

全球重繪我將如何能夠避免全球重繪=呼叫到主視圖函數 而在主模塊視圖方法改變的子模塊的視圖,如:避免對模塊化視圖模型

m("body", [ 
      m("#head", {...}), 
      Menu.show(this), 
      Footer.show(this) 
]) 

在靜態展示方法是這樣的:

function show(app) 
    { 
     if (inst == null) 
      inst = new Footer(app); 
     return inst.view(app); 
    } 

現在應該加大對已經很好的性能,如果沒有一個運行的 觀點方法的子畫面,而不在的情況下運行的主視圖方式在變化的方法子視圖有局部影響。這有意義嗎?

阿克塞爾

回答

1

重繪是祕銀全球運營,這迫使你進入結構決定是由設計。 Mithril並沒有公開允許從應用程序中的任何給定點對視圖渲染過程進行精細控制的API,而是通過比較優化虛擬DOM模型的迭代的專門差異算法來處理整個過程。

話雖如此,還有影響的版本比較邏輯和渲染的實現依賴於上下文的方式:

  1. 調用m.redraw.strategy在正確的時間nonediff的參數可以完全阻止重繪或避免會是什麼否則分別完整DOM重繪。在我的應用程序中,一個特別複雜的模塊會觸發並作出反應以連續發送更改(多個列表,其中每個項目本身是一個子模塊DOM結構,可選的額外小部件等) - 通過在控制器中設置m.redraw.strategy('diff'),我設法保持性能〜55FPS,即使只修改DOM不同的塊(儘管如此也是大塊!)。
  2. 調用{ subtree : 'retain' }您希望從差異例程中移除的虛擬DOM的某些部分。如果你想讓DOM算法忽略大塊DOM(因此不會被後續重繪所觸及),可以在視圖中指定這個特殊參數。請注意,如果您稍後決定刪除子樹保留指令,則整個內部DOM樹必須重新呈現至少一次,因爲之前的迭代不會被diff引擎註冊 - 所以我不會建議嘗試使用這個猜測或差異算法。
  3. 使用{ key : 'uniqueIdentifier' }突出顯示diff算法可能另外識別爲新的元素。如果你有一塊視圖在重繪之間相對於DOM中舊位置移動,那麼差異算法將破壞舊視圖並從頭開始渲染新視圖。指定一個獨特的key將允許它確定它應該移動現有的DOM結構,並在其中應用任何修補程序。如果一個龐大而複雜的DOM結構已經改變了它的位置,但是如果在大量的小物件上使用它時開始反對性能,這是非常有用的。例如,在我的應用程序中,我將鍵添加到每個列表項(每個列表項都至少有8個元素的子模塊,事件處理程序等),以避免重繪僅移動到列表中的項目。事實證明,刪除key並且只是在他們將改進的性能提高100%時從零開始創建元素。

但我的建議是讓米索莉做它認爲最好的。 Mithril比其他MVC庫的視圖組件的主要優點之一是Mithril可以讓你在90%的時間內忘記重繪週期,並在需要時讓它發生。這是一個優點!另外需要記住的是,無數人花費無數開發人員的時間來嘗試讓Javascript MVC渲染速度更快 - 而祕銀是最快的之一。很可能,在大多數情況下,祕銀核心可能比猜測其內部邏輯更優化。正如我上面的經驗表明,引入額外的代碼來提高性能實際上違背了我的期望。祕銀的速度非常快 - 這應該讓我們把我們的創造力花在其他問題上!

+1

'm.redraw.stragegy('diff')'中有一個輸入錯誤。 – 2016-06-28 09:11:00

+0

斑點@StephanHoyer! – Barney 2016-06-28 09:12:04

+1

我複製並粘貼,它沒有工作,但pssst;) – 2016-06-29 09:28:38

3

你不能阻止全球重繪,但你可以選擇使視圖的某些部分不使用subtree directives

然而請注意,這是禁用重繪受影響的子樹性能優化重繪,並因此,除非您再次用子樹替換該指令,否則您將無法更新其視圖。