Otomatik Yeniden Çizim Sistemi
Mithril.js, hızlı renderlama için sanal DOM diffing sistemi kullanır ve ayrıca, uygulamanın renderlanması üzerinde detaylı kontrol elde etmek için çeşitli mekanizmalar sunar.
Mithril.js, doğru kullanıldığında, veri katmanında değişiklikler yapıldığında DOM'u senkronize eden bir otomatik yeniden çizim sistemi kullanır. Otomatik yeniden çizim sistemi, m.mount
veya m.route
'u çağırdığınızda etkinleşir (ancak uygulamanız yalnızca m.render
çağrıları aracılığıyla başlatılırsa devre dışı kalır).
Otomatik yeniden çizim sistemi, belirli fonksiyonlar tamamlandıktan sonra arka planda bir yeniden çizim fonksiyonunu tetiklemekten ibarettir.
Olay İşleyicilerden Sonra
Mithril.js, bir Mithril.js görünümünde tanımlanan DOM olay işleyicilerinden sonra otomatik olarak yeniden çizim yapar:
var MyComponent = {
view: function () {
return m('div', { onclick: doSomething });
},
};
function doSomething() {
// Bu fonksiyon çalıştıktan sonra eş zamanlı olarak yeniden çizim yapılır
}
m.mount(document.body, MyComponent);
e.redraw
'ı false
olarak ayarlayarak belirli olaylar için otomatik yeniden çizimi devre dışı bırakabilirsiniz:
var MyComponent = {
view: function () {
return m('div', { onclick: doSomething });
},
};
function doSomething(e) {
e.redraw = false;
// div'e tıklandığında artık bir yeniden çizim tetiklenmez
}
m.mount(document.body, MyComponent);
m.request'ten Sonra
Mithril.js, m.request
tamamlandıktan sonra otomatik olarak yeniden çizim yapar:
m.request('/api/v1/users').then(function () {
// Bu fonksiyon çalıştıktan sonra yeniden çizim gerçekleşir
});
background
seçeneğini true
olarak ayarlayarak belirli bir istek için otomatik yeniden çizimi devre dışı bırakabilirsiniz:
m.request('/api/v1/users', { background: true }).then(function () {
// Yeniden çizim tetiklenmez
});
Rota Değişikliklerinden Sonra
Mithril.js, m.route.set()
çağrılarından sonra ve m.route.Link
kullanılarak yapılan rota değişikliklerinden sonra otomatik olarak yeniden çizim yapar.
var RoutedComponent = {
view: function () {
return [
// Rota değiştiğinde asenkron olarak yeniden çizim gerçekleşir
m(m.route.Link, { href: '/' }),
m('div', {
onclick: function () {
m.route.set('/');
},
}),
];
},
};
m.route(document.body, '/', {
'/': RoutedComponent,
});
Mithril.js ne zaman yeniden çizim yapmaz
Mithril.js, setTimeout
, setInterval
, requestAnimationFrame
, doğrudan Promise
çözümlemeleri ve 3. taraf kütüphane olay işleyicileri (örneğin, Socket.io geri çağrıları) sonrasında yeniden çizim yapmaz. Bu durumlarda, manuel olarak m.redraw()
çağırmanız gerekir.
Mithril.js, yaşam döngüsü metotlarından sonra da yeniden çizim yapmaz. UI'nın bazı bölümleri bir oninit
işleyicisinden sonra yeniden çizilebilir. Ancak, bazı durumlarda UI'nın diğer bölümleri oninit
işleyicisi tetiklendiğinde zaten yeniden çizilmiş olabilir. oncreate
ve onupdate
gibi işleyiciler, UI yeniden çizildikten sonra tetiklenir.
Bir yaşam döngüsü metodu içinde açıkça bir yeniden çizimi tetiklemeniz gerekiyorsa, asenkron bir yeniden çizimi tetiklemek için m.redraw()
'ı çağırmalısınız.
function StableComponent() {
var height = 0;
return {
oncreate: function (vnode) {
height = vnode.dom.offsetHeight;
m.redraw();
},
view: function () {
return m('div', 'Bu bileşen ' + height + 'px yüksekliğinde');
},
};
}
Mithril.js, m.render
aracılığıyla oluşturulan vnode ağaçlarını otomatik olarak yeniden çizmez. Bu, m.render
ile oluşturulan şablonlarda olay değişiklikleri ve m.request
çağrılarından sonra otomatik yeniden çizim olmadığı anlamına gelir. Bu nedenle, mimariniz renderlamanın ne zaman gerçekleşeceği üzerinde manuel kontrol gerektiriyorsa (Redux gibi kütüphaneleri kullanırken bazen durum böyle olabilir), m.mount
yerine m.render
kullanmalısınız.
m.render
'ın bir vnode ağacı ve m.mount
'un bir bileşen beklediğini unutmayın:
// m.render için bileşeni bir m() çağrısına sarın
m.render(document.body, m(MyComponent));
// m.mount için bileşeni sarmayın
m.mount(document.body, MyComponent);
Mithril.js, istenen yeniden çizimlerin sıklığı bir animasyon karesinden (tipik olarak yaklaşık 16ms) daha yüksekse de otomatik yeniden çizimden kaçınabilir. Bu, örneğin, onresize
veya onscroll
gibi hızlı tetiklenen olayları kullanırken, Mithril.js'nin gecikmeyi önlemek için yeniden çizim sayısını otomatik olarak sınırlandıracağı anlamına gelir.