'use strict'; var document = require('global/document'); var hg = require('../index.js'); var h = require('../index.js').h; var setTimeout = require('timers').setTimeout; function Hook() {} // Hook to be called when DOM node has been rendered Hook.prototype.hook = function hook(node) { // Note that you should only modify DOM node attributes in virtual-dom // hooks, anything else is unsafe node.style.color = 'red'; }; // Hook to be called when DOM node is removed Hook.prototype.unhook = function unhook(node) { node.style.color = null; }; function Widget() { this.type = 'Widget'; } Widget.prototype.init = function init() { var elem = document.createElement('div'); elem.innerHTML = 'Content set directly on real DOM node, by widget ' + 'before update.'; return elem; }; Widget.prototype.update = function update(prev, elem) { elem.innerHTML = 'Content set directly on real DOM node, by widget ' + 'after update.'; }; function App() { var state = hg.state({ updated: hg.value(false) }); setTimeout(function timer() { state.updated.set(true); }, 2000); return state; } App.render = function App(state) { return h('div', [ // Create virtual node with hook if !state.updated h('div', !state.updated ? {hook: new Hook()} : {}, [ 'Style attribute of real DOM node set by ', h('em', 'hook'), ' and unset by ', h('em', 'unhook') ]), // Create widget controlled node new Widget() ]); }; hg.app(document.body, App(), App.render);