var logs = [] function log(vnode){ logs.push([vnode.attrs.text, {active: vnode.state.active}]) } var Button = { active: false, oninit: log, onbeforeupdate: log, view: function (vnode) { var onclick = function () {vnode.state.active = !vnode.state.active} return m("button", {onclick: onclick, style: vnode.state.active ? "color:red" : ""}, vnode.attrs.text) } } var button = m(Button, {text: "Inactive Button"}) var MainComponent = { view: function () { return [ m(Button, {text: "Active Button", onclick: onclick}), Object.assign({}, button) ] } } m.render(document.body, [m("#a"), m("#b")]) m.mount(a, MainComponent) m.mount(b, { view: function () { return m("pre", logs.map(function (log) { return JSON.stringify(log) + '\n' }) ) } })