我正在通过 like 通过@open-wc来工作,目前正在尝试编写一组嵌套的组件,其中内部组件是输入字段,而一些祖先组件必须支持一些任意重写规则,比如“不允许输入数字”。
我想弄清楚的是,,什么是正确的方法,构建这是使用发光元素。在React中,我将使用一个‘控制组件’请看这里,轻松地迫使所有组件提交到根组件属性。
下面的例子是我提出的使用发光元素的方法。有更好的方法吗
请注意;,由于我想忽略一些字符,挑战变得更加困难。如果没有级别为5的e.target.value = this.value;,则输入单元将在忽略的字符上偏离组件状态。我希望整个组件链能够正确同步,因此标头标记可以举例说明。
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>
`;
}
}后加
替代方法在事件中使用路径数组直接从根组件访问输入元素。
我认为这是一个更糟的解决方案,因为它会导致组件之间更强的耦合,即假设子组件是具有值属性的输入元素。
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;
}发布于 2019-12-10 14:46:18
不要组合你的事件,用你的逻辑来处理它们。让孩子在事件中发送所有需要的信息,尽量不要依赖父事件处理程序中的target。
要接收更新,让您的组件订阅一个共享混合器,这是la @mishu的建议,它使用了一些状态容器(在这里,我给出了一些假想的状态解决方案)
import { subscribe } from 'some-state-solution';
export const FormMixin = superclass => class extends superclass {
static get properties() { return { value: { type: String }; } }
connectedCallback() {
super.connectedCallback();
subscribe(this);
}
}然后,您可以在updated或事件处理程序(在父容器或状态容器中只使用UI- do逻辑)中处理任何特定于组件的副作用。
import { publish } from 'some-state-solution';
class Level1 extends LitElement {
// ...
onInput({ detail: { value } }) {
publish('value', value.replace(/\d/g, ''));
}
}https://stackoverflow.com/questions/58962444
复制相似问题