2

我想做一个下拉菜单,当点击输入时,菜单会显示一个切换,删除或放置“隐藏”类

我有这个方法

toggleMenu() {
    this.classList.toggle("hidden");
}

这里是模板。

render(){
   return html`
       <input @click="${this.toggleMenu}" type="button">
       <ul class="hidden">
           <slot></slot>
       </ul>
   `;
}
4

2 回答 2

4

一个直接的解决方案是向您的自定义元素添加一个属性,例如,在您的方法open中切换:toggleMenu

static get properties() {
  return {
    open: { type: Boolean },
  };
}

constructor() {
  super();
  this.open = false;
}

toggleMenu() {
  this.open = !this.open;
}

然后在您的render方法中根据 的值设置<ul>'s属性:classthis.open

render(){
  return html`
    <button @click=${this.toggleMenu} type="button">Toggle</button>
    <ul class=${this.open ? '' : 'hidden'}>
      <slot></slot>
    </ul>
  `;
}

您可以在下面的代码段中看到这个工作:

// import { LitElement, css, html } from 'lit-element';
const { LitElement, css, html } = litElement;

class DropDownMenu extends LitElement {
  static get properties() {
    return {
      open: { type: Boolean },
    };
  }

  static get styles() {
    return css`
      ul.hidden {
        display: none;
      }
    `;
  }

  constructor() {
    super();
    this.open = false;
  }
  
  toggleMenu() {
    this.open = !this.open;
  }

  render(){
    return html`
      <button @click=${this.toggleMenu} type="button">Toggle</button>
      <ul class=${this.open ? '' : 'hidden'}>
        <slot></slot>
      </ul>
    `;
  }
}
customElements.define('drop-down-menu', DropDownMenu);
<script src="https://bundle.run/lit-element@2.2.1"></script>

<drop-down-menu>
  <li>Item 1</li>
  <li>Item 2</li>
</drop-down-menu>

如果您想将其他类应用于<ul>您需要查看LitElement 文档classMap中描述的函数。


或者,您可以添加reflect: trueopen属性声明中,这样您就可以单独显示或隐藏<ul>using CSS,而不是将其设置classrender

static get properties() {
  return {
    open: {
      type: Boolean,
      reflect: true,
    },
  };
}

static get styles() {
  return css`
    ul {
      display: none;
    }
    :host([open]) ul {
      display: block;
    }
  `;
}

这是一个工作片段:

// import { LitElement, css, html } from 'lit-element';
const { LitElement, css, html } = litElement;

class DropDownMenu extends LitElement {
  static get properties() {
    return {
      open: {
        type: Boolean,
        reflect: true,
      },
    };
  }

  static get styles() {
    return css`
      ul {
        display: none;
      }
      :host([open]) ul {
        display: block;
      }
    `;
  }

  constructor() {
    super();
    this.open = false;
  }
  
  toggleMenu() {
    this.open = !this.open;
  }

  render(){
    return html`
      <button @click=${this.toggleMenu} type="button">Toggle</button>
      <ul>
        <slot></slot>
      </ul>
    `;
  }
}
customElements.define('drop-down-menu', DropDownMenu);
<script src="https://bundle.run/lit-element@2.2.1"></script>

<drop-down-menu>
  <li>Item 1</li>
  <li>Item 2</li>
</drop-down-menu>

这两种都是常用方法,最适合您的应用程序的方法取决于您的用例和个人偏好。

于 2020-01-16T20:33:31.107 回答
1

我喜欢保持简单,如果您需要对 DOM 节点的引用,然后将事件传递给函数,如下所示:

toggleMenu(ev) {
    ev.target.classList.toggle("hidden");
}

而对于渲染方法

render(){
   return html`
       <input @click="${(ev)=>{this.toggleMenu(ev)}}" type="button">
       <ul class="hidden">
           <slot></slot>
       </ul>
   `;
}

你完成了

于 2020-01-19T15:58:48.243 回答