Skip to content

Instantly share code, notes, and snippets.

@PatrickJS
Forked from developit/little-vdom.js
Created February 27, 2020 16:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PatrickJS/644e6d7493e18c831594e7fd9101ec3e to your computer and use it in GitHub Desktop.
Save PatrickJS/644e6d7493e18c831594e7fd9101ec3e to your computer and use it in GitHub Desktop.
export const h=(t,p,...c)=>({t,p,c,k:p&&p.key})
export const render=(e,d,t=d.t||(d.t={}),p,r,c)=>
// arrays
e.pop?e.map((e,p)=>render(e,d,t.o&&t.o[p])):
// components
e.t.call?(e.i=render((render.c=e).t({children:e.c,...e.p},e.s=t.s||{},t=>
render(Object.assign(e.s,t)&&e,d,e)),t.i||d,t&&t.i||{}),e):(
// create notes
e.d=t.d||(e.t?document.createElement(e.t):new Text(e.p)),
// diff props
e.p!=t.p&&(e.t?Object.keys(e.p||{}).map(d=>
(c=e.p[d])!=(t.p&&t.p[d])&&(d in e.d?e.d[d]=c:e.d.setAttribute(d,c))):e.d.data=e.p),
// insert at position
t.d&&p==r||d.insertBefore(e.d,d.childNodes[p+1]),
// diff children (typed/keyed)
e.o=e.c.concat.apply([],e.c).map((d,p)=>render(d=d.c?d:h('',d),e.d,
t.o&&t.o.find((e,c)=>e&&e.t==d.t&&e.k==d.k&&(c==p&&(p=r),t.o[c]=0,e))||{},p)),
// remove stragglers
t.o&&t.o.map(e=>e&&e.d.remove()),Object.assign(t,e)
)
h=(t,p,...c)=>({t,p,c,k:p&&p.key}),render=(e,d,t=d.t||(d.t={}),p,r,c)=>e.pop?e.map((e,p)=>render(e,d,t.o&&t.o[p])):e.t.call?(e.i=render((render.c=e).t({children:e.c,...e.p},e.s=t.s||{},t=>render(Object.assign(e.s,t)&&e,d,e)),t.i||d,t&&t.i||{}),e):(e.d=t.d||(e.t?document.createElement(e.t):new Text(e.p)),e.p!=t.p&&(e.t?Object.keys(e.p||{}).map(d=>(c=e.p[d])!=(t.p&&t.p[d])&&(d in e.d?e.d[d]=c:e.d.setAttribute(d,c))):e.d.data=e.p),t.d&&p==r||d.insertBefore(e.d,d.childNodes[p+1]),e.o=e.c.concat.apply([],e.c).map((d,p)=>render(d=d.c?d:h("",d),e.d,t.o&&t.o.find((e,c)=>e&&e.t==d.t&&e.k==d.k&&(c==p&&(p=r),t.o[c]=0,e))||{},p)),t.o&&t.o.map(e=>e&&e.d.remove()),Object.assign(t,e));
little={h,render};typeof module!='undefined'&&(module.exports=little)
{"name":"little-vdom","module":"little-vdom.js","main":"little-vdom.min.js","version":"0.1.0"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment