censor(object, extra)
Descrição
Retorna um objeto clonado superficialmente, omitindo atributos de ciclo de vida e quaisquer atributos personalizados especificados.
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
Assinatura
censored = m.censor(object, extra)
Argumento | Tipo | Obrigatório | Descrição |
---|---|---|---|
object | Object | Sim | Um objeto chave-valor a ser processado. |
extra | Array<String> | Não | Propriedades adicionais a serem omitidas. |
retorna | Object | O objeto original, se não houver propriedades a serem omitidas; caso contrário, um objeto clonado superficialmente com as propriedades removidas. |
Como funciona
Normalmente, você não precisa deste método e pode simplesmente especificar os atributos desejados. No entanto, às vezes é mais conveniente repassar todos os atributos desconhecidos para outro elemento. Embora isso geralmente seja aceitável, pode levar a problemas com os métodos de ciclo de vida sendo chamados duas vezes.
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, [
// !!!
// ...
]);
},
};
}
Isso pode parecer inofensivo, mas cria um problema: você está enviando duas requisições cada vez que esta view é acessada. É aqui que m.censor
se torna útil: ele remove oncreate
dos atributos, garantindo que seja chamado apenas uma vez e evitando comportamentos inesperados.
// Corrigido
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
Você também pode encontrar problemas semelhantes com keys
:
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,
]),
];
},
};
}
Isso resultaria em um erro lançando um erro porque é isso que o Mithril.js vê ao criar o vnode Layout
:
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
Isso pode não ser óbvio à primeira vista, especialmente em cenários mais complexos com indireção e outros problemas. Para corrigir isso, você também precisa remover o atributo key
. Você também pode censurar o atributo pageTitle
, já que ele não tem utilidade no DOM.
// Corrigido
function Layout() {
return {
view: function (vnode) {
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', m.censor(vnode.attrs, ['pageTitle', 'key']), [
m('h2', vnode.attrs.pageTitle),
vnode.children,
]),
];
},
};
}