gpt4 book ai didi

javascript - Lit-elements,编写受控组件的惯用方式

转载 作者:行者123 更新时间:2023-12-04 16:44:29 25 4
gpt4 key购买 nike

我正在使用 点亮元素 通过 @open-wc并且目前正在尝试编写一组嵌套的组件,其中内部组件是 输入栏 还有一些 祖先组件 必须支持一些任意重写规则比如“不允许输入数字”。

我想弄清楚的是构建它的正确方法是使用 lit-elements .在 react 我会使用 ' 受控组件 ' see here轻松强制所有组件提交到根组件属性。

下面的示例是我使用 Lit-Elements 提出的。 有没有更好的方法 ?

请注意; 因为我想忽略一些 Angular 色,所以挑战变得稍微困难​​了。没有 e.target.value = this.value;在第 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;
}

最佳答案

不要编写你的事件,用你的逻辑在大父级中处理它们。让 children 在事件中发送所有需要的信息,尽量不要依赖target在父事件处理程序中。

要接收更新,请让您的组件订阅一个共享的 mixin,这是 @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 - 在父级或状态容器中执行逻辑)

import { publish } from 'some-state-solution';
class Level1 extends LitElement {
// ...
onInput({ detail: { value } }) {
publish('value', value.replace(/\d/g, ''));
}
}

关于javascript - Lit-elements,编写受控组件的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58962444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com