【问题标题】:Using a Material Web Component inside a litElement在 litElement 中使用 Material Web 组件
【发布时间】:2019-10-31 09:15:02
【问题描述】:

我正在尝试使用 Polymer 项目中的 PWA Starter Kit 制作一个小应用程序。

是否可以在我的 LitElement 中使用来自 https://material.io/develop/web/components/input-controls/text-field/ 的 Web 组件?我想使用文本区域。

我尝试过的:

import {html, customElement, LitElement} from "lit-element";
//
import {MDCTextField} from '@material/textfield';

@customElement('text-editor')
export class TextEditor extends LitElement {

    protected render() {
        return html`<div class="mdc-text-field mdc-text-field--textarea">
  <textarea id="textarea" class="mdc-text-field__input" rows="8" cols="40"></textarea>
  <div class="mdc-notched-outline">
    <div class="mdc-notched-outline__leading"></div>
    <div class="mdc-notched-outline__notch">
      <label for="textarea" class="mdc-floating-label">Textarea Label</label>
    </div>
    <div class="mdc-notched-outline__trailing"></div>
  </div>
</div>`
    }

}

但是,因为我没有在任何地方使用“MDCTextField”,TypeScript 编译器会抱怨“'MDCTextField' 已声明但它的值从未被读取。”。

我确实得到了一个在 HTML 中呈现的文本区域,但没有应用任何样式。

如何在 LitElement 中重用 MDCTextField Web 组件?

【问题讨论】:

    标签: web-component polymer-starter-kit lit-element


    【解决方案1】:

    是的,您必须使用 LitElement 的 static styles,它使用 Constructible 样式以及不支持的浏览器的后备:

    import { html, customElement, LitElement, unsafeCSS } from 'lit-element';
    
    import { MDCTextField } from '@material/textfield';
    
    // IMPORTANT: USE WEBPACK RAW-LOADER OR EQUIVALENT
    import style from 'raw-loader!@material/textfield/dist/mdc.textfield.css';
    
    @customElement('text-editor')
    export class TextEditor extends LitElement {
    
      static styles = [unsafeCSS(style)];
    
      private textField?: MDCTextField;
    
      connectedCallback() {
    
        super.connectedCallback();
    
        const elm = this.shadowRoot!.querySelector('.mdc-text-field')! as HTMLElement;
    
        if (elm && !this.textField) {
          // Element is re-attached to the DOM
          this.makeTextField();
        }
      }
    
      disconnectedCallback() {
        if (this.textField) {
          this.textField.destroy();
          this.textField = undefined;
        }
      }
    
      render() {
        return html`
          <div class='mdc-text-field mdc-text-field--textarea'>
            <textarea id='textarea' class='mdc-text-field__input' rows='8' cols='40'></textarea>
            <div class='mdc-notched-outline'>
              <div class='mdc-notched-outline__leading'></div>
              <div class='mdc-notched-outline__notch'>
                <label for='textarea' class='mdc-floating-label'>Textarea Label</label>
              </div>
              <div class='mdc-notched-outline__trailing'></div>
            </div>
        </div>`;
      }
    
      firstUpdated() {
        // Executed just once
        this.makeTextField();
      }
    
      private makeTextField() {
        const elm = this.shadowRoot!.querySelector('.mdc-text-field')! as HTMLElement;
    
        this.textField = new MDCTextField(elm);
      }
    
    }
    

    这些是你需要做的事情:

    1. 使用 Webpack 或 rollup 之类的打包器将 CSS 文件作为字符串读取。在上面的示例中,我将 Sebpack 与 raw-loader 一起使用。
    2. 使用firstUpdated生命周期事件在组件第一次渲染时初始化MDCTextField
    3. 随后,组件可能会被移除并重新插入到 DOM 中,因此您需要销毁、清理并重新初始化 MDCTextField 实例。

    【讨论】:

    • 当我使用您的代码示例时,网页中没有显示任何内容。但是,如果我注释掉“connectedCallback”,那么它就会被渲染:/
    • 这就是我的意思:stackblitz.com/edit/lhprwb(没有 css,因为我无法让它在 stackblitzt 中工作)。如果我取消对 connectedCallback 函数的注释,则页面上不会显示任何内容。
    • @zelite,对不起!我忘了在connectedCallback 方法中添加super.connectedCallback();。 LitElement 在其超类中执行一次性初始化,因此它是必需的。我更新了 sn-p。
    • 您有使用汇总和非打字稿显示 litelement 中的材质组件的示例吗?
    • @aver,我没有非 TypeScript 示例。但这应该会有所帮助:github.com/webf-zone/sprinkles
    猜你喜欢
    • 1970-01-01
    • 2022-09-18
    • 1970-01-01
    • 2021-08-25
    • 2020-06-15
    • 2019-11-05
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多