Skip to content
This repository was archived by the owner on Apr 29, 2021. It is now read-only.
This repository was archived by the owner on Apr 29, 2021. It is now read-only.

Glimmer #11

@jridgewell

Description

@jridgewell

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;
}

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions