This repository was archived by the owner on Apr 29, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
This repository was archived by the owner on Apr 29, 2021. It is now read-only.
Glimmer #11
Copy link
Copy link
Open
Labels
Description
After #10 lands, we can shamelessly rip off Glimmer's rendering engine.
First, the naive approach (that we're currently doing) is to diff everything:
function render() {
return <div>
<span>{this.props.content}</span>
<ul>
{ this.props.li.map((li) => { <li>{li}</li> }) }
</ul>
</div>;
}
// - - -
function render() {
elementOpen("div");
elementOpen("span");
_renderArbitrary(this.props.content);
elementClose("span");
elementOpen("ul");
this.props.li.map(function (li) {
elementOpen("li");
_renderArbitrary(li);
elementClose("li");
});
elementClose("ul");
return elementClose("div");
}
In essence, we'll diff the <div>
, the <span>
, the span's content, the <ul>
and the ul's content. But, we can do a bit better using Glimmer's approach.
Essentially, we only ever need to patch the <span>
and <ul>
on second renders:
// First render
function render() {
render.div = elementOpen("div");
render.span = elementOpen("span");
_renderArbitrary(this.props.content);
elementClose("span");
render.ul = elementOpen("ul");
this.props.li.map(function (li) {
elementOpen("li");
_renderArbitrary(li);
elementClose("li");
});
elementClose("ul");
return elementClose("div");
}
// Second render
function secondRender() {
patch(render.span, _renderArbitrary, this.props.content);
patch(render.ul, function() {
elementOpen("li");
_renderArbitrary(li);
elementClose("li");
});
return render.div;
}
This can pay off immensely for static renders or deeply nested views:
function render() {
return <div>
<div>
<span>Lot</span>
</div>
<div>
<span>o'</span>
</div>
<div>
<span>Content</span>
</div>
</div>;
}
// - - -
function secondRender() {
return render.div;
}
function render() {
return <div>
<div>
<div>
<div>
<span>{this.props.content}</span>
</div>
</div>
</div>
</div>;
}
// - - -
function secondRender() {
patch(render.span, _renderArbitrary, this.props.content);
return render.div;
}