我正在通过@open-wc使用lit-elements,目前正在尝试编写一组嵌套的组件,其中内部组件是输入字段,并且某些祖先组件必须支持一些任意重写规则,例如“不允许输入数字” '。
我想弄清楚的是使用 lit-elements 构建它的正确方法是什么。在React中,我将使用“受控组件”,请参见此处轻松强制所有组件提交到根组件属性。
下面的示例是我使用 Lit-Elements 提出的。有更好的方法吗?
请注意; 因为我想忽略一些角色,所以挑战变得稍微困难了。如果没有e.target.value = this.value;
at level-5,输入元素将与忽略字符上的组件状态不同。我希望整个组件链正确同步,因此要举例说明标题标签。
export class Level1 extends LitElement {
static get properties() {
return {
value: { type: String }
};
}
render() {
return html`
<div>
<h1>${this.value}</h1>
<level-2 value=${this.value} @input-changed=${this.onInput}></level-2>
</div>`;
}
onInput(e) {
this.value = e.detail.value.replace(/\d/g, '');
}
}
...
export class Level4 extends LitElement {
static get properties() {
return {
value: { type: String }
};
}
render() {
return html`
<div>
<h4>${this.value}</h4>
<level-5 value=${this.value}></level-5>
</div>`;
}
}
export class Level5 extends LitElement {
static get properties() {
return {
value: { type: String }
};
}
render() {
return html`
<div>
<h5>${this.value}</h5>
<input .value=${this.value} @input=${this.onInput}></input>
</div>`;
}
onInput(e) {
let event = new CustomEvent('input-changed', {
detail: { value: e.target.value },
bubbles: true,
composed: true
});
e.target.value = this.value;
this.dispatchEvent(event);
}
}
export class AppShell extends LitElement {
constructor() {
super();
this.value = 'initial value';
}
render() {
return html`
<level-1 value=${this.value}></level-1>
`;
}
}
稍后添加
另一种方法是在事件中使用路径数组直接从根组件访问输入元素。
我认为这是一个更糟糕的解决方案,因为它导致组件之间的耦合更强,即假设子组件是具有 value 属性的输入元素。
onInput(e) {
const target = e.path[0]; // origin input element
this.value = e.path[0].value.replace(/\d/g, '');
// controlling the child elements value to adhere to the colletive state
target.value = this.value;
}