Skip to content

Commit 79abca1

Browse files
authored
Render any value returned by #render. (#712)
* Test that returning undefined from the first call to `#render` doesn't remove shimmed adopted style sheets. * Render any value returned by `#render`. * Update change log. * format * Update lit-html dependency to v1.1.1. * Update types for static and instance `render` methods. * Add type for static `render` function. Fix types in comments. * `test.only` -> `test`
1 parent c482db5 commit 79abca1

File tree

4 files changed

+79
-21
lines changed

4 files changed

+79
-21
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1212

1313
## Unreleased
1414
<!-- ### Added -->
15+
### Changed
16+
* The value returned by `render` is always rendered, even if it isn't a `TemplateResult`. ([#712](https://github.com/Polymer/lit-element/issues/712)
1517
<!-- ### Removed -->
1618

1719
### Added

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
},
6464
"typings": "lit-element.d.ts",
6565
"dependencies": {
66-
"lit-html": "^1.0.0"
66+
"lit-html": "^1.1.1"
6767
},
6868
"publishConfig": {
6969
"access": "public"

src/lit-element.ts

+20-20
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
* subject to an additional IP rights grant found at
1212
* http://polymer.github.io/PATENTS.txt
1313
*/
14-
import {TemplateResult} from 'lit-html';
15-
import {render} from 'lit-html/lib/shady-render.js';
14+
import {render, ShadyRenderOptions} from 'lit-html/lib/shady-render.js';
1615

1716
import {PropertyValues, UpdatingElement} from './lib/updating-element.js';
1817

@@ -45,15 +44,17 @@ export class LitElement extends UpdatingElement {
4544
* optimizations. See updating-element.ts for more information.
4645
*/
4746
protected static['finalized'] = true;
47+
4848
/**
49-
* Render method used to render the lit-html TemplateResult to the element's
50-
* DOM.
51-
* @param {TemplateResult} Template to render.
52-
* @param {Element|DocumentFragment} Node into which to render.
53-
* @param {String} Element name.
49+
* Render method used to render the value to the element's DOM.
50+
* @param result The value to render.
51+
* @param container Node into which to render.
52+
* @param options Element name.
5453
* @nocollapse
5554
*/
56-
static render = render;
55+
static render:
56+
(result: unknown, container: Element|DocumentFragment,
57+
options: ShadyRenderOptions) => void = render;
5758

5859
/**
5960
* Array of styles to apply to the element. The styles should be defined
@@ -194,14 +195,11 @@ export class LitElement extends UpdatingElement {
194195
*/
195196
protected update(changedProperties: PropertyValues) {
196197
super.update(changedProperties);
197-
const templateResult = this.render() as unknown;
198-
if (templateResult instanceof TemplateResult) {
199-
(this.constructor as typeof LitElement)
200-
.render(
201-
templateResult,
202-
this.renderRoot,
203-
{scopeName: this.localName, eventContext: this});
204-
}
198+
(this.constructor as typeof LitElement)
199+
.render(
200+
this.render(),
201+
this.renderRoot,
202+
{scopeName: this.localName, eventContext: this});
205203
// When native Shadow DOM is used but adoptedStyles are not supported,
206204
// insert styling after rendering to ensure adoptedStyles have highest
207205
// priority.
@@ -216,10 +214,12 @@ export class LitElement extends UpdatingElement {
216214
}
217215

218216
/**
219-
* Invoked on each update to perform rendering tasks. This method must return
220-
* a lit-html TemplateResult. Setting properties inside this method will *not*
221-
* trigger the element to update.
217+
* Invoked on each update to perform rendering tasks. This method may return
218+
* any value renderable by lit-html's NodePart - typically a TemplateResult.
219+
* Setting properties inside this method will *not* trigger the element to
220+
* update.
222221
*/
223-
protected render(): TemplateResult|void {
222+
protected render(): unknown {
223+
return undefined;
224224
}
225225
}

src/test/lit-element_styling_test.ts

+56
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,62 @@ suite('Static get styles', () => {
798798
const bodyStyles = `${cssModule}`;
799799
assert.equal(bodyStyles, '.my-module { color: yellow; }');
800800
});
801+
802+
test(
803+
'Styles are not removed if the first rendered value is undefined.',
804+
async () => {
805+
const localName = generateElementName();
806+
807+
class SomeCustomElement extends LitElement {
808+
static styles = css`:host {border: 4px solid black;}`;
809+
810+
renderUndefined: boolean;
811+
812+
constructor() {
813+
super();
814+
this.renderUndefined = true;
815+
}
816+
817+
static get properties() {
818+
return {
819+
renderUndefined: {
820+
type: Boolean,
821+
value: true,
822+
},
823+
};
824+
}
825+
826+
render() {
827+
if (this.renderUndefined) {
828+
return undefined;
829+
}
830+
831+
return htmlWithStyles`Some text.`;
832+
}
833+
}
834+
customElements.define(localName, SomeCustomElement);
835+
836+
const element = document.createElement(localName) as SomeCustomElement;
837+
document.body.appendChild(element);
838+
839+
await (element as LitElement).updateComplete;
840+
assert.equal(
841+
getComputedStyle(element)
842+
.getPropertyValue('border-top-width')
843+
.trim(),
844+
'4px');
845+
846+
element.renderUndefined = false;
847+
848+
await (element as LitElement).updateComplete;
849+
assert.equal(
850+
getComputedStyle(element)
851+
.getPropertyValue('border-top-width')
852+
.trim(),
853+
'4px');
854+
855+
document.body.removeChild(element);
856+
});
801857
});
802858

803859
suite('ShadyDOM', () => {

0 commit comments

Comments
 (0)