censor(object, extra)
描述
傳回一個對象的淺拷貝,其中省略了生命週期屬性以及任何指定的自訂屬性。
javascript
var attrs = { one: 'two', enabled: false, oninit: function () {} };
var censored = m.censor(attrs, ['enabled']);
// {one: "two"}
簽名
censored = m.censor(object, extra)
參數 | 類型 | 是否必填 | 描述 |
---|---|---|---|
object | Object | 是 | 要進行處理的鍵值映射表(對象)。 |
extra | Array<String> | 否 | 要省略的其他屬性名稱陣列。 |
回傳值 | Object | 如果原始對象上不存在要省略的屬性,則返回原始對象;否則,返回一個已移除指定屬性的淺拷貝對象。 |
運作方式
通常,您不需要此方法,只需明確指定您想要的屬性即可。但有時,將所有您不清楚的屬性傳遞給另一個元素會更方便。這通常是合理的,但可能會導致一個主要的陷阱:生命週期方法被呼叫兩次。
javascript
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, [
// !!!
// ...
]);
},
};
}
這看起來很正常,但會產生一個問題:每次瀏覽到此視圖時,您都會傳送兩次觸發。這就是 m.censor
的作用:它允許您從屬性中移除 oncreate
,以便它只被調用一次,並且調用者可以保持程式碼的清晰,並確信他們不會因此而遇到難以排查的錯誤。
javascript
// 已修正
function SomeFancyView() {
return {
view: function (vnode) {
return m('div', m.censor(vnode.attrs), [
// ...
]);
},
};
}
您也可能會遇到類似的鍵的問題:
javascript
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,
]),
];
},
};
}
這最終會拋出一個錯誤,因為這是 Mithril.js 在建立 Layout
虛擬節點 (vnode) 時看到的:
javascript
return [
m('header', [m('h1', 'My beautiful web app'), m('nav')]),
m('.body', { pageTitle: 'Some Page', key: someKey }, [
m('h2', 'Some Page'),
[
/* ... */
],
]),
];
您一開始不太可能注意到這一點,尤其是在更真實的場景中,可能存在間接或其他問題。為了糾正這一點,您同樣必須剔除 key:
屬性。您也可以移除自定義的 pageTitle
屬性,因為它在 DOM 中沒有提供任何實際作用。
javascript
// 已修正
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,
]),
];
},
};
}