Skip to content
Mithril.js 2
Main Navigation 指南API

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

繁體中文

English
简体中文
Español
Français
Русский
Português – Brasil
Deutsch
日本語
한국어
Italiano
Polski
Türkçe
čeština
magyar

外觀

Sidebar Navigation

API

核心 API

m(selector, attributes, children)

render(element, vnodes)

mount(root, component)

route(root, defaultRoute, routes)

request(options)

parseQueryString(string)

buildQueryString(object)

buildPathname(object)

parsePathname(string)

trust(html)

fragment(attrs, children)

redraw()

censor(object, extra)

可選 API

stream()

指南

本頁導覽

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)

參數類型是否必填描述
objectObject是要進行處理的鍵值映射表(對象)。
extraArray<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,
        ]),
      ];
    },
  };
}
Pager
上一頁redraw()
下一頁stream()

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors

https://mithril.js.org/censor.html

以 MIT 授權條款 發布。

版權所有 (c) 2024 Mithril Contributors