diff --git a/src/component.ts b/src/component.ts index 736e64f1..59aa2481 100644 --- a/src/component.ts +++ b/src/component.ts @@ -280,7 +280,9 @@ export class Component< this.env = Object.create(this.env); } Object.assign(this.env, nextEnv); - return this.render(); + if (this.__widget__.isMounted) { + return this.render(); + } } async updateProps(nextProps: Props): Promise { diff --git a/tests/component.test.ts b/tests/component.test.ts index 025cb0c4..9fe53bb3 100644 --- a/tests/component.test.ts +++ b/tests/component.test.ts @@ -1096,6 +1096,29 @@ describe("updating environment", () => { expect((widget).env.somekey).toBe(4); }); + test("updating widget env does not render widget (if not mounted)", async () => { + let n = 0; + class TestWidget extends Widget { + _render() { + n++; + return super._render(); + } + } + + const widget = new TestWidget(env); + expect(n).toBe(0); + await widget.updateEnv({ somekey: 4 }); + expect(n).toBe(0); + await widget.mount(fixture); + expect(n).toBe(1); + await widget.updateEnv({ somekey: 5 }); + expect(n).toBe(2); + widget.detach(); + expect(n).toBe(2); + await widget.updateEnv({ somekey: 5 }); + expect(n).toBe(2); + }); + test("updating child env does not modify parent env", async () => { class ParentWidget extends Widget { inlineTemplate = `
`;