Skip to content

Instantly share code, notes, and snippets.

@Raynos
Forked from Matt-Esch/thunk.js
Last active August 29, 2015 13:57
Show Gist options
  • Save Raynos/9868704 to your computer and use it in GitHub Desktop.
Save Raynos/9868704 to your computer and use it in GitHub Desktop.
var cuid = require("cuid")
var dom = require("./render")
var diff = require("./diff")
var patch = require("./patch")
var isString = require("./lib/is-string")
/* Usage
var thunk = require("virtual-dom/thunk")
module.exports = thunk(function render(current, previous) {
if (previous && previous.id === current.id) {
return null
}
return h("div", current.value)
})
*/
module.exports = thunk
function thunk(type, render) {
if (arguments.length === 1) {
render = type
type = null
}
function Thunk(state) {
if (!(this instanceof Thunk)) {
return new Thunk(state)
}
this.state = state
this.vnodes = new Map() // set all properties
}
Thunk.prototype.type = isString(type) ? type : cuid()
Thunk.prototype.render = render
Thunk.prototype.init = initThunk
Thunk.prototype.update = updateThunk
return Thunk
}
function initThunk() {
var vnode = this.render(this.state)
var domNode = dom(this.vnode)
this.vnodes.set(domNode, vnode)
return domNode
}
function updateThunk(previous, domNode) {
var currentState = this.state
var render = this.render
var vnode = this.vnodes.get(domNode)
if (!vnode) {
vnode = render(currentState, previous.state)
this.vnodes.set(domNode, vnode)
}
var prevNode = previous.vnodes.get(domNode)
if (vnode) {
patch(domNode, diff(prevNode, vnode))
} else {
this.vnodes.set(domNode, prevNode)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment