Как определить количество детей в слоте - PullRequest
0 голосов
/ 15 декабря 2018

Есть ли способ узнать, сколько дочерних элементов содержит именованный слот?В моем компоненте Stencil у меня есть что-то вроде этого в моей функции рендеринга:

<div class="content">
  <slot name="content"></slot>
</div>

Что я хочу сделать, это по-разному стилизовать div.content в зависимости от того, сколько дочерних элементов находится внутри слота.Если в слоте нет дочерних элементов, то div.content style.display = 'none', в противном случае к div.content применяется несколько стилей, которые позволяют правильно отображать дочерние элементы на экране.

Я попытался сделать:

  const divEl = root.querySelector( 'div.content' );
  if( divEl instanceof HTMLElement ) {
    const slotEl = divEl.firstElementChild;
    const hasChildren = slotEl && slotEl.childElementCount > 0;
    if( !hasChildren ) {
      divEl.style.display = 'none';
    }
  }

, однако всегда сообщается hasChildren = false, даже если в слот вставлены предметы.

1 Ответ

0 голосов
/ 16 декабря 2018

Если вы запрашиваете хост-элемент, вы получите весь выделенный контент внутри него.Это означает, что потомками хост-элемента будет весь контент, который будет вставлен в слот.Например, попробуйте использовать следующий код, чтобы увидеть его в действии:

import {Component, Element, State} from '@stencil/core';

@Component({
  tag: 'my-component',
  styleUrl: 'my-component.css',
  shadow: true
})
export class MyComponent {
  @Element() host: HTMLElement;
  @State() childrenData: any = {};

  componentDidLoad() {
    let slotted = this.host.children;
    this.childrenData = { hasChildren: slotted && slotted.length > 0, numberOfChildren: slotted && slotted.length };
  }

  render() {
    return (
    <div class="content">
      <slot name="content"></slot>
      <div>
        Slot has children: {this.childrenData.hasChildren ? 'true' : 'false'}
      </div>
      <div>
        Number of children: {this.childrenData.numberOfChildren}
      </div>
    </div>);
  }
}
...