javascript - LitElement 中的自定义属性访问器
问题描述
为了学习如何编写自定义属性访问器,我正在尝试创建与默认访问器具有相同行为的属性访问器。我在这里使用文档中的示例,但我正在努力让它工作。以下导致Uncaught RangeError: Maximum call stack size exceeded
错误。如果我删除 getter 和 setter,元素会按预期工作,并呈现包含“hello”和“world”的两个 div。如何为 property 创建自定义属性访问器,data
其行为与默认属性访问器相同(未定义 getter 和 setter)?
import { LitElement, html } from "lit-element";
import { render } from "lit-html";
class TestElement extends LitElement {
static get properties() {
return {
data: { type: Array },
};
}
set data(val) {
let oldVal = this.data;
this.data = val;
this.requestUpdate("data", oldVal);
}
get data() {
return this.data;
}
constructor() {
super();
this.data = [];
}
render() {
return html`${this.data.map(d => html` <div>${d}</div>`)}`;
}
}
customElements.define("test-element", TestElement);
render(html`<test-element .data=${["hello", "world"]}></test-element>`, window.document.body);
我正在尝试重新创建此示例的行为,它按预期呈现“hello”和“world”:
import { LitElement, html } from "lit-element";
import { render } from "lit-html";
class TestElement extends LitElement {
static get properties() {
return {
data: { type: Array },
};
}
constructor() {
super();
this.data = [];
}
render() {
return html`${this.data.map(d => html` <div>${d}</div>`)}`;
}
}
customElements.define("test-element", TestElement);
render(html`<test-element .data=${["hello", "world"]}></test-element>`, window.document.body);
解决方案
set data(val) {
let oldVal = this.data;
this.data = val; // THIS causes an infinity loop as you do invoke the setter again
this.requestUpdate("data", oldVal);
}
相反,设置一个不同的变量
set data(val) {
let oldVal = this.data;
this.__data = val;
this.requestUpdate("data", oldVal);
}
get data() {
return this.__data;
}
推荐阅读
- javascript - Redux Saga 两次异步调用
- php - Wordpress 重定向到带有 vars 的自定义 .php 文件
- javascript - iframe 子页面标记中的宽度属性在 Firefox 上被更改
- r - 如何在 R 中使用并发值求和
- portal - Azure DevOps 的票证日志记录门户
- javascript - 'success' 是 jquery click 函数的有效属性吗
- ansible - 如何使用ansible验证特定接口的静态路由
- amazon-web-services - Cloudformation 模板报告为可用容器的缺失属性
- node.js - Docker 构建在 codebuild 中的 npm 包失败
- c++ - 将数字附加到文件