首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发光元素,编写受控组件的惯用方法。

发光元素,编写受控组件的惯用方法。
EN

Stack Overflow用户
提问于 2019-11-20 20:01:25
回答 1查看 1.1K关注 0票数 5

我正在通过 like 通过@open-wc来工作,目前正在尝试编写一组嵌套的组件,其中内部组件是输入字段,而一些祖先组件必须支持一些任意重写规则,比如“不允许输入数字”。

我想弄清楚的是,,什么是正确的方法,构建这是使用发光元素。在React中,我将使用一个‘控制组件请看这里,轻松地迫使所有组件提交到根组件属性。

下面的例子是我提出的使用发光元素的方法。有更好的方法吗

请注意;,由于我想忽略一些字符,挑战变得更加困难。如果没有级别为5的e.target.value = this.value;,则输入单元将在忽略的字符上偏离组件状态。我希望整个组件链能够正确同步,因此标头标记可以举例说明。

代码语言:javascript
复制
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>
    `;
  }
}

后加

替代方法在事件中使用路径数组直接从根组件访问输入元素。

我认为这是一个更糟的解决方案,因为它会导致组件之间更强的耦合,即假设子组件是具有值属性的输入元素。

代码语言:javascript
复制
  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;
  }
EN

回答 1

Stack Overflow用户

发布于 2019-12-10 14:46:18

不要组合你的事件,用你的逻辑来处理它们。让孩子在事件中发送所有需要的信息,尽量不要依赖父事件处理程序中的target

要接收更新,让您的组件订阅一个共享混合器,这是la @mishu的建议,它使用了一些状态容器(在这里,我给出了一些假想的状态解决方案)

代码语言:javascript
复制
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逻辑)中处理任何特定于组件的副作用。

代码语言:javascript
复制
import { publish } from 'some-state-solution';
class Level1 extends LitElement {
  // ...
  onInput({ detail: { value } }) {
    publish('value', value.replace(/\d/g, '')); 
  } 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58962444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档