v0.2.x'ten Geçiş
Eğer geçiş yapıyorsanız, v1.x ve v2.x büyük ölçüde v0.2.x ile API uyumluluğuna sahiptir, ancak bazı uyumsuz değişiklikler bulunmaktadır. v2.x'e geçiş neredeyse aynıdır, bu nedenle aşağıdaki notlar çoğunlukla her ikisi için de geçerlidir.
Geçişinizi kolaylaştırmak için mithril-codemods aracını kullanarak en basit geçişleri otomatik hale getirebilirsiniz.
m.prop kaldırıldı
v2.x'te m.prop() artık daha güçlü bir akış mikro-kütüphanesine dönüştürüldü, ancak artık çekirdek kütüphanenin bir parçası değildir. İsteğe bağlı Streams modülünü belgelerde nasıl kullanacağınız hakkında bilgi edinebilirsiniz.
v0.2.x
var m = require('mithril');
var num = m.prop(1);v2.x
var m = require('mithril');
var prop = require('mithril/stream');
var num = prop(1);
var doubled = num.map(function (n) {
return n * 2;
});m.component kaldırıldı
v0.2.x'te bileşenler m(Component) veya m.component(Component) kullanılarak oluşturulabiliyordu. v2.x sadece m(Component)'i desteklemektedir.
v0.2.x
// Bunlar eşdeğerdir
m.component(Component);
m(Component);v2.x
m(Component);m.withAttr kaldırıldı
v0.2.x'te olay işleyicileri oninput: m.withAttr("value", func) şeklinde kullanılabiliyordu. v2.x'te, değeri doğrudan olayın hedefinden okumanız gerekir. m.prop ile iyi bir sinerji oluşturuyordu, ancak bu çekirdek dışı bir çözüm lehine kaldırıldığından ve v1.x benzer geniş, deyimsel akış kullanımını görmediğinden, m.withAttr kullanışlılığının çoğunu kaybetti.
v0.2.x
var value = m.prop('');
// View katmanında
m('input[type=text]', {
value: value(),
oninput: m.withAttr('value', value),
});v2.x
var value = '';
// View katmanında
m('input[type=text]', {
value: value,
oninput: function (ev) {
value = ev.target.value;
},
});m.version kaldırıldı
Genel olarak çok az işe yarıyordu ve her zaman kendiniz geri ekleyebilirsiniz. Hangi özelliklerin mevcut olduğunu bilmek için özellik algılamayı tercih etmelisiniz ve v2.x API'si bunu daha iyi sağlamak için tasarlanmıştır.
config fonksiyonu
v0.2.x'te Mithril.js tek bir yaşam döngüsü metodu olan config'i sağlıyordu. v2.x, bir vnode'un yaşam döngüsü üzerinde çok daha ayrıntılı kontrol sağlar.
v0.2.x
m('div', {
config: function (element, isInitialized) {
// her yeniden çizim sırasında çalışır
// isInitialized, düğümün DOM'a eklenip eklenmediğini temsil eden bir boolean değeridir
},
});v2.x
Bu yeni metotlar hakkında daha fazla dokümantasyon lifecycle-methods.md adresinde mevcuttur.
m('div', {
// DOM düğümü oluşturulmadan önce çağrılır
oninit: function (vnode) {
/*...*/
},
// DOM düğümü oluşturulduktan sonra çağrılır
oncreate: function (vnode) {
/*...*/
},
// Düğüm güncellenmeden önce çağrılır, iptal etmek için false döndürün
onbeforeupdate: function (vnode, old) {
/*...*/
},
// Düğüm güncellendikten sonra çağrılır
onupdate: function (vnode) {
/*...*/
},
// Düğüm kaldırılmadan önce çağrılır, DOM'dan kaldırılmaya hazır olduğunda çözümlenen bir Promise döndürün
onbeforeremove: function (vnode) {
/*...*/
},
// Düğüm kaldırılmadan önce, ancak onbeforeremove done() çağırdıktan sonra çağrılır
onremove: function (vnode) {
/*...*/
},
});Mevcutsa, vnode'un DOM-Element'ine vnode.dom üzerinden erişilebilir.
Yeniden çizim davranışındaki değişiklikler
Mithril.js'nin render motoru hala yarı otomatik global yeniden çizimler temelinde çalışır, ancak bazı API'ler ve davranışlar farklılık gösterir:
Artık yeniden çizim kilitleri yok
v0.2.x'te Mithril.js, geçici olarak engellenen çizim mantığını durduran 'yeniden çizim kilitlerine' izin veriyordu: varsayılan olarak, m.request yürütme sırasında çizim döngüsünü kilitler ve bekleyen tüm istekler çözüldüğünde kilidi açardı - aynı davranış m.startComputation() ve m.endComputation() kullanılarak manuel olarak çağrılabilirdi. İkinci API'ler ve ilişkili davranış, v2.x'te değiştirilmeden kaldırılmıştır. Yeniden çizim kilitleme, hatalı UI'lara yol açabilir: uygulamanın bir bölümünün, görünümün değişimi yansıtacak şekilde güncellenmesini engellemesine izin verilmemelidir.
Olay işleyicilerinden yeniden çizimi iptal etme
m.mount() ve m.route(), bir DOM olay işleyicisi çalıştıktan sonra otomatik olarak yeniden çizmeye devam eder. Bu yeniden çizimleri olay işleyicilerinizden iptal etmek artık, olay nesnesindeki redraw özelliğini false olarak ayarlayarak yapılır.
v0.2.x
m('div', {
onclick: function (e) {
m.redraw.strategy('none');
},
});v2.x
m('div', {
onclick: function (e) {
e.redraw = false;
},
});Senkron yeniden çizim değiştirildi
v0.2.x'te, m.redraw()'a doğru (truthy) bir değer geçirerek Mithril.js'yi hemen yeniden çizmeye zorlamak mümkündü. v2.x'te, bu işlevsellik açıklık sağlamak için iki farklı metoda ayrılmıştır.
v0.2.x
m.redraw(true); // redraws immediately & synchronouslyv2.x
m.redraw(); // bir sonraki requestAnimationFrame tick'inde bir yeniden çizim planlar
m.redraw.sync(); // hemen bir yeniden çizim çağırır ve tamamlanmasını beklerm.startComputation/m.endComputation kaldırıldı
Bunlar anti-pattern olarak kabul edilir ve bir dizi sorunlu uç duruma sahiptir, bu nedenle v2.x'te değiştirilmeden kaldırılmıştır.
Bileşen controller fonksiyonu
v2.x'te, bileşenlerde artık controller özelliği yok - bunun yerine oninit kullanın.
v0.2.x
m.mount(document.body, {
controller: function () {
var ctrl = this;
ctrl.fooga = 1;
},
view: function (ctrl) {
return m('p', ctrl.fooga);
},
});v2.x
m.mount(document.body, {
oninit: function (vnode) {
vnode.state.fooga = 1;
},
view: function (vnode) {
return m('p', vnode.state.fooga);
},
});
// VEYA
m.mount(document.body, {
// bu varsayılan olarak vnode.state'e bağlıdır
oninit: function (vnode) {
this.fooga = 1;
},
view: function (vnode) {
return m('p', this.fooga);
},
});Bileşen argümanları
v2.x'te bir bileşene geçirilen argümanlar bir nesne olmalıdır, String/Number/Boolean gibi basit değerler metin çocukları olarak kabul edilecektir. Argümanlara, vnode.attrs nesnesinden okunarak bileşen içinde erişilir.
v0.2.x
var Component = {
controller: function (options) {
// options.fooga === 1
},
view: function (ctrl, options) {
// options.fooga === 1
},
};
m('div', m.component(Component, { fooga: 1 }));v2.x
var Component = {
oninit: function (vnode) {
// vnode.attrs.fooga === 1
},
view: function (vnode) {
// vnode.attrs.fooga === 1
},
};
m('div', m(Component, { fooga: 1 }));Bileşen vnode çocukları
v0.2.x'te, bileşen vnode çocukları normalleştirilmemiştir, sadece ekstra argümanlar olarak geçirilmişlerdi ve düzleştirilmemişlerdi. (Dahili olarak, sadece kısmen uygulanan bir bileşen döndürüyordu ve bu bileşen kısmen uygulanmasına göre farklılaştırılıyordu.) v2.x'te, bileşen vnode çocukları, çözümlenmiş bir çocuk dizisi olarak vnode.children aracılığıyla geçirilir, ancak v0.2.x gibi, bireysel çocuklar kendileri normalleştirilmez ve çocuk dizisi de düzleştirilmez.
v0.2.x
var Component = {
controller: function (value, renderProp) {
// value === "value"
// typeof renderProp === "function"
},
view: function (ctrl, value, renderProp) {
// value === "value"
// typeof renderProp === "function"
},
};
m(
'div',
m.component(Component, 'value', function (key) {
return 'child';
})
);v2.x
var Component = {
oninit: function (vnode) {
// vnode.children[0] === "value"
// typeof vnode.children[1] === "function"
},
view: function (vnode) {
// vnode.children[0] === "value"
// typeof vnode.children[1] === "function"
},
};
m(
'div',
m(Component, 'value', function (key) {
return 'child';
})
);DOM vnode öğeleri
v0.2.x'te, DOM düğümlerinin çocukları, yalnızca tek bir dizi çocuğu varsa doğrudan çocukları kullanmak dışında, hiçbir normalleştirme olmadan tam anlamıyla temsil ediliyordu. Dizeler tam anlamıyla temsil edildiği için daha çok buna benzer bir yapı döndürüyordu.
m("div", "value", ["nested"])
// Becomes:
{
tag: "div",
attrs: {},
children: [
"value",
["nested"],
]
}v2.x'te, DOM vnode'larının çocukları tek bir tutarlı yapının nesnelerine normalleştirilir.
m("div", "value", ["nested"])
// Becomes roughly:
{
tag: "div",
attrs: null,
children: [
{tag: "#", children: "value"},
{tag: "[", children: [
{tag: "#", children: "nested"},
]},
]
}Bir DOM vnode'unda yalnızca tek bir metin çocuğu varsa, bunun yerine text özelliği bu değere ayarlanır.
m("div", "value")
// Becomes roughly:
{
tag: "div",
attrs: null,
text: "",
children: undefined,
}v2.x vnode yapısı ve işlerin nasıl normalleştirildiği hakkında daha fazla ayrıntı için vnode belgelerine bakın.
Keyler
v0.2.x'te, key'li ve key'siz vnode'ları serbestçe karıştırabilirsiniz.
v2.x'te, hem fragment'lerin hem de element'lerin çocuk listeleri ya tamamen key'li ya da tamamen key'siz olmalıdır. Boşluklar da bu kontrolün amaçları doğrultusunda key'siz olarak kabul edilir - artık onları yok sayılmaz.
Bundan kaçınmanız gerekiyorsa, tek bir vnode içeren bir fragment ifadesi kullanın, örneğin [m("div", {key: whatever})].
view() parametreleri
v0.2.x'te görünüm fonksiyonlarına controller örneğine ve (isteğe bağlı olarak) bileşene geçirilen herhangi bir seçeneğe bir referans geçirilir. v2.x'te, controller fonksiyonu gibi yalnızca vnode geçirilir.
v0.2.x
m.mount(document.body, {
controller: function () {},
view: function (ctrl, options) {
// ...
},
});v2.x
m.mount(document.body, {
oninit: function (vnode) {
// ...
},
view: function (vnode) {
// ctrl yerine vnode.state'i kullanın
// options yerine vnode.attrs'ı kullanın
},
});m()'e bileşenleri geçirme
v0.2.x'te, herhangi bir sarma işlemi gerektirmeden bileşenleri m()'in ikinci argümanı olarak geçirebilirsiniz. v2.x'te tutarlılığa yardımcı olmak için, her zaman bir m() çağrısıyla sarılmaları gerekir.
v0.2.x
m('div', Component);v2.x
m('div', m(Component));m.mount() ve m.route()'a vnode'lar geçirme
v0.2.x'te, m.mount(element, component), bileşenler yerine ikinci argüman olarak vnode'lara tolerans gösteriyordu (belgelenmemiş olsa bile). Benzer şekilde, m.route(element, defaultRoute, routes), routes nesnesindeki değerler olarak vnode'ları kabul ediyordu.
v2.x'te, her iki durumda da bileşenler gereklidir.
v0.2.x
m.mount(element, m('i', 'hello'));
m.mount(element, m(Component, attrs));
m.route(element, '/', {
'/': m('b', 'bye'),
});v2.x
m.mount(element, {
view: function () {
return m('i', 'hello');
},
});
m.mount(element, {
view: function () {
return m(Component, attrs);
},
});
m.route(element, '/', {
'/': {
view: function () {
return m('b', 'bye');
},
},
});m.route.mode
v0.2.x sürümlerinde, yönlendirme modu m.route.mode değişkenine "pathname", "hash" veya "search" değerlerinden biri atanarak belirleniyordu. v1.x'te bu, m.route.prefix = prefix ile değiştirildi; burada prefix herhangi bir önek olabilir. # ile başlayanlar "hash" modunda, ? ile başlayanlar "search" modunda, diğer karakterler veya boş dizeler ise "pathname" modunda çalışır. Ayrıca m.route.prefix = "/path/#!" ya da ?# gibi yukarıdakilerin kombinasyonları da desteklenir.
Varsayılan değer, sadece # yerine #! (hashbang) önekini kullanacak şekilde değiştirildi. Bu nedenle, varsayılan davranışı kullanıyorsanız ve mevcut URL'lerinizi korumak istiyorsanız, rotaları başlatmadan önce m.route.prefix = "#" belirtin.
v0.2.x
m.route.mode = 'hash';
m.route.mode = 'pathname';
m.route.mode = 'search';v2.x
// Doğrudan karşılıkları:
m.route.prefix = '#';
m.route.prefix = '';
m.route.prefix = '?';m.route() ve anchor etiketleri
Yönlendirilebilir bağlantılar artık bir özellik (attribute) yerine özel, yerleşik bir bileşen kullanılarak işleniyor. Eğer bunu <button> gibi öğelerde kullanıyorsanız, selector: "button" özelliği kullanarak bu etiket adını belirtebilirsiniz.
v0.2.x
// Bu bağlantıya tıklandığında, gezinmek yerine "/path" rotası yüklenecek
m('a', {
href: '/path',
config: m.route,
});v2.x
// Bu bağlantıya tıklandığında, gezinmek yerine "/path" rotası yüklenecek
m(m.route.Link, {
href: '/path',
});Yol şablonları
v1.x'te, benzer olmalarına rağmen ayrı tasarlanmış sözdizimleri ve farklı uygulamaları olan üç ayrı yol şablonu sözdizimi vardı. Bunlar yeterince açık tanımlanmamıştı ve parametreler genellikle escape edilmiyordu. Artık :key kullanıldığında değerler otomatik olarak kodlanır, :key... kullanıldığında ise ham (raw) olarak bırakılır. Eğer bir şeyler beklenmedik şekilde kodlanmışsa, :path... kullanın. Bu kadar basit.
Somut olarak, bunun her yöntemi nasıl etkilediği aşağıda açıklanmıştır:
m.request URL'leri
v2.x'teki yol bileşenleri, enterpolasyon yapıldığında otomatik olarak escape edilir ve değerlerini params'tan okurlar. v0.2.x'te, m.request({url: "/user/:name/photos/:id", data: {name: "a/b", id: "c/d"}}) isteği /user/a%2Fb/photos/c/d olarak ayarlanan URL ile gönderilirdi. v2.x'te, karşılık gelen m.request({url: "/user/:name/photos/:id", params: {name: "a/b", id: "c/d"}}) isteği /user/a%2Fb/photos/c%2Fd adresine gönderilir. Eğer bir anahtarı escape etmeden enterpole etmek istiyorsanız, :key... kullanın.
/api/search?q=:query gibi doğrudan sorgu dizelerindeki enterpolasyonlar v2.x'te gerçekleştirilmez. Bunları sorgu dizesinde belirtmeden, uygun anahtar adlarıyla params aracılığıyla geçirin.
Bunun m.jsonp için de geçerli olduğunu unutmayın. m.request + dataType: "jsonp"'den m.jsonp'ye geçerken, bunun da farkında olmanız gerekir.
m.route(route, params, shouldReplaceHistoryEntry) yolları
Bunlar artık enterpolasyonlara izin veriyor ve m.request'inkiyle aynı şekilde çalışıyorlar.
m.route rota kalıpları
:key... biçimindeki yol anahtarları, v1.x'te URL'si çözülmüş olarak dönerken, v2.x'te işlenmemiş URL'yi döndürür.
Önceden, :key.md gibi ifadeler hatalı bir şekilde kabul ediliyordu ve sonuçtaki parametrenin değeri keymd: "..." olarak ayarlanıyordu. Artık durum böyle değil - .md artık kalıbın bir parçası, adın değil.
Geçerli rotayı okuma/yazma
v0.2.x sürümlerinde, geçerli rotayla ilgili tüm işlemler m.route() fonksiyonu üzerinden yapılıyordu. v2.x'te bu, iki fonksiyona ayrıldı.
v0.2.x
// Geçerli rotayı alma
m.route();
// Yeni bir rota ayarlama
m.route('/other/route');v2.x
// Geçerli rotayı alma
m.route.get();
// Yeni bir rota ayarlama
m.route.set('/other/route');Rota parametrelerine erişme
Bu API v2.x'te de kullanılabilir. Ayrıca, rota parametreleri vnode üzerindeki attrs nesnesine özellik olarak aktarılır.
v0.2.x
m.route(document.body, '/booga', {
'/:attr': {
controller: function () {
m.route.param('attr'); // "booga"
},
view: function () {
m.route.param('attr'); // "booga"
},
},
});v2.x
m.route(document.body, '/booga', {
'/:attr': {
oninit: function (vnode) {
vnode.attrs.attr; // "booga"
m.route.param('attr'); // "booga"
},
view: function (vnode) {
vnode.attrs.attr; // "booga"
m.route.param('attr'); // "booga"
},
},
});Sorgu dizeleri oluşturma/ayrıştırma
v0.2.x sürümlerinde m.route.buildQueryString() ve m.route.parseQueryString() yöntemleri m.route nesnesine bağlıydı. v2.x'te bunlar ayrıldı ve kök m'ye taşındı.
v0.2.x
var qs = m.route.buildQueryString({ a: 1 });
var obj = m.route.parseQueryString('a=1');v2.x
var qs = m.buildQueryString({ a: 1 });
var obj = m.parseQueryString('a=1');Ayrıca, v2.x'te {key: undefined}, m.buildQueryString ve onu kullanan m.request gibi yöntemler tarafından key=undefined olarak serileştirilir. v0.2.x'te anahtar atlanırdı ve bu m.request'e aktarılırdı. Eğer bu duruma bağlı bir kodunuz varsa, nesnedeki undefined değerlere sahip anahtarları tamamen kaldıracak şekilde kodunuzu güncelleyin. Bunu kolayca yapamıyorsanız ve v0.2.x davranışını korumanız gerekiyorsa, değerleri undefined olan bir nesneden tüm anahtarları temizlemek için basit bir yardımcı program kullanmaya değer olabilir.
// Bir nesneden `undefined` parametrelerini atlamanız gerektiğinde çağırın.
function omitUndefineds(object) {
var result = {};
for (var key in object) {
if ({}.hasOwnProperty.call(object, key)) {
var value = object[key];
if (Array.isArray(value)) {
result[key] = value.map(omitUndefineds);
} else if (value != null && typeof value === 'object') {
result[key] = omitUndefineds(value);
} else if (value !== undefined) {
result[key] = value;
}
}
}
return result;
}Unmounting'i önleme
onunload fonksiyonundaki e.preventDefault() ile unmounting engelleme özelliği kaldırıldı. Bunun yerine, beklenen koşullar karşılandığında m.route.set'i açıkça çağırmalısınız.
v0.2.x
var Component = {
controller: function () {
this.onunload = function (e) {
if (condition) e.preventDefault();
};
},
view: function () {
return m('a[href=/]', { config: m.route });
},
};v2.x
var Component = {
view: function () {
return m('a', {
onclick: function () {
if (!condition) m.route.set('/');
},
});
},
};Bileşen kaldırıldığında kodu çalıştırma
Bileşenler artık kaldırıldıklarında this.onunload'u çağırmıyor. Artık standartlaştırılmış yaşam döngüsü kancası onremove'u kullanıyorlar.
v0.2.x
var Component = {
controller: function () {
this.onunload = function (e) {
// ...
};
},
view: function () {
// ...
},
};v2.x
var Component = {
onremove: function() {
// ...
}
view: function() {
// ...
}
}m.request
m.request tarafından döndürülen Promise'ler artık m.prop getter-setter'lar değil. Ek olarak, initialValue, unwrapSuccess ve unwrapError artık desteklenen seçenekler değil.
İstekler artık m.startComputation/m.endComputation davranışını sergilemiyor. Bunun yerine, bir istek promise zinciri tamamlandığında (eğer background: true ayarlanmamışsa) yeniden çizimler her zaman tetiklenir.
data parametresi ikiye ayrıldı: URL'ye enterpole edilerek isteğe eklenen sorgu parametreleri için params, ve XHR ile gönderilecek veri gövdesi için body.
v0.2.x'te, bir JSONP isteği başlatmak için dataType: "jsonp" kullanırdınız. v2.x'te, artık XHR ile ilgili parçalar olmadan m.request ile hemen hemen aynı API'yi taşıyan m.jsonp kullanıyorsunuz.
v0.2.x
var data = m.request({
method: 'GET',
url: 'https://api.github.com/',
initialValue: [],
});
setTimeout(function () {
console.log(data());
}, 1000);
m.request({
method: 'POST',
url: 'https://api.github.com/',
data: someJson,
});v2.x
var data = [];
m.request({
method: 'GET',
url: 'https://api.github.com/',
}).then(function (responseBody) {
data = responseBody;
});
setTimeout(function () {
console.log(data); // not: bir getter-setter değil
}, 1000);
m.request({
method: 'POST',
url: 'https://api.github.com/',
body: someJson,
});
// VEYA
var data = [];
m.request('https://api.github.com/').then(function (responseBody) {
data = responseBody;
});
setTimeout(function () {
console.log(data); // not: bir getter-setter değil
}, 1000);
m.request('https://api.github.com/', {
method: 'POST',
body: someJson,
});Ek olarak, extract seçeneği m.request'e geçirilirse, sağlanan fonksiyonun dönüş değeri doğrudan istek promise'ini çözmek için kullanılır ve deserialize geri çağrısı yoksayılır.
m.request başlıkları
v0.2.x'te, Mithril.js varsayılan olarak isteklere herhangi bir başlık ayarlamadı. Şimdi, en fazla 2 başlık ayarlıyor:
- JSON gövdesi
!= nullolan istekler içinContent-Type: application/json; charset=utf-8 - JSON yanıtları bekleyen istekler için
Accept: application/json, text/*
Content-Type başlığı, CORS-safelisted istek başlığı olmadığı için CORS ön kontrolü tetikleyebilir ve sunucunuzdaki CORS yapılandırmasına bağlı olarak hatalara yol açabilir. Bununla ilgili sorunlarla karşılaşırsanız, headers: {"Content-Type": "text/plain"} geçirerek söz konusu başlığı geçersiz kılmanız gerekebilir. ( Accept başlığı hiçbir şeyi tetiklemez, bu nedenle onu geçersiz kılmanız gerekmez.)
Fetch spesifikasyonu, CORS ön getirme kontrollerinden kaçınmaya izin veren tek içerik türlerinin application/x-www-form-urlencoded, multipart/form-data ve text/plain olduğunu belirtir. Başka hiçbir şeye izin vermez ve kasıtlı olarak JSON'a izin vermez.
m.deferred kaldırıldı
v0.2.x sürümlerinde m.request'in temelini oluşturan m.deferred adında özel bir asenkron nesne kullanılıyordu. v2.x bunun yerine Promise'leri kullanır ve desteklemeyen ortamlarda bir polyfill uygular. m.deferred'i kullanacağınız durumlarda, bunun yerine Promise'leri kullanmalısınız.
v0.2.x
var greetAsync = function () {
var deferred = m.deferred();
setTimeout(function () {
deferred.resolve('hello');
}, 1000);
return deferred.promise;
};
greetAsync()
.then(function (value) {
return value + ' world';
})
.then(function (value) {
console.log(value);
}); //1 saniye sonra "hello world" çıktısını verirv2.x
var greetAsync = function () {
return new Promise(function (resolve) {
setTimeout(function () {
resolve('hello');
}, 1000);
});
};
greetAsync()
.then(function (value) {
return value + ' world';
})
.then(function (value) {
console.log(value);
}); //1 saniye sonra "hello world" çıktısını verirm.sync kaldırıldı
v2.x standartlara uygun Promise'leri kullandığından, m.sync gereksizdir. Bunun yerine Promise.all kullanın.
v0.2.x
m.sync([
m.request({ method: 'GET', url: 'https://api.github.com/users/lhorie' }),
m.request({
method: 'GET',
url: 'https://api.github.com/users/dead-claudia',
}),
]).then(function (users) {
console.log('Katkı Sağlayanlar:', users[0].name, 've', users[1].name);
});v2.x
Promise.all([
m.request({ method: 'GET', url: 'https://api.github.com/users/lhorie' }),
m.request({
method: 'GET',
url: 'https://api.github.com/users/dead-claudia',
}),
]).then(function (users) {
console.log('Katkı Sağlayanlar:', users[0].name, 've', users[1].name);
});xlink ad alanı gerekli
Ad alanı ayrıştırma desteği eklendiğinden, ad alanlı özelliklerin ad alanları artık açıkça belirtilmelidir.
v0.2.x
m(
'svg',
// `href` özelliği otomatik olarak ad alanına alınır
m("image[href='image.gif']")
);v2.x
m(
'svg',
// `href` özelliği üzerinde kullanıcı tarafından belirtilen ad alanı
m("image[xlink:href='image.gif']")
);Görünümlerde iç içe diziler
Diziler artık v2.x sanal DOM'unda yapısal öneme sahip olan parçaları temsil etmektedir. v0.2.x'te iç içe diziler karşılaştırma işlemi için tek bir listeye dönüştürülürken, v2.x dizi yapısını korur. Bu nedenle, bir dizinin alt öğeleri bitişik dizilerin kardeşleri olarak değerlendirilmez.
vnode eşitlik kontrolleri
Eğer bir vnode, son çizimde aynı pozisyonda bulunan vnode ile tamamen aynı ise, v2.x bu bölümdeki değişiklikleri kontrol etmez ve alt ağaçtaki yaşam döngüsü metotlarını çalıştırmaz. Bileşen belgeleri, bu konuyla ilgili daha fazla ayrıntı içerir.