censor(object, extra)
Descrizione
Restituisce una copia superficiale di un oggetto, escludendo gli attributi del ciclo di vita di Mithril.js e qualsiasi attributo personalizzato specificato.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
Firma
censored = m.censor(object, extra)
Argomento | Tipo | Richiesto | Descrizione |
---|---|---|---|
object | Object | Sì | Un oggetto chiave-valore (mappa). |
extra | Array<String> | No | Un array di nomi di proprietà aggiuntive da escludere. |
restituisce | Object | L'oggetto originale se non ci sono proprietà da escludere, altrimenti una copia superficiale dell'oggetto con le proprietà specificate rimosse. |
Come funziona
Nella maggior parte dei casi, non è necessario questo metodo; è sufficiente specificare gli attributi desiderati. Tuttavia, a volte è più pratico passare tutti gli attributi, inclusi quelli sconosciuti, a un altro elemento. Questo è spesso accettabile, ma può causare problemi con i metodi del ciclo di vita, che potrebbero essere chiamati più volte.
function SomePage() {
return {
view: function () {
return m(SomeFancyView, {
oncreate: function () {
sendViewHit(m.route.get(), 'some fancy view');
},
});
},
};
}
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', vnode.attrs, [
// !!!
// ...
]);
},
};
}
Questo codice sembra innocuo, ma introduce un problema: la funzione sendViewHit
viene chiamata due volte ogni volta che si naviga verso questa vista. È qui che m.censor
diventa utile: permette di escludere oncreate
dagli attributi, assicurando che venga eseguito una sola volta e prevenendo comportamenti inattesi.
// Corretto
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Si possono riscontrare problemi simili anche con le chiavi:
function SomePage() {
return {
view: function () {
return m(
Layout,
{
pageTitle: 'Some Page',
key: someKey,
},
[
// ...
]
);
},
};
}
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', vnode.attrs, [
// !!!
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}
Questo potrebbe causare un errore perché Mithril.js vedrebbe il vnode Layout
in questo modo:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Probabilmente non lo si noterebbe subito, soprattutto in scenari più complessi con indirezioni e/o altri problemi. Per correggere questo, è necessario escludere l'attributo key
. Si può anche escludere l'attributo personalizzato pageTitle
, dato che la sua presenza nel DOM non apporta alcun valore.
// Corretto
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', m.censor(vnode.attrs, ['pageTitle']), [
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}