Сворачивание всего содержимого элемента (кроме одного) без упаковки в div - PullRequest
0 голосов
/ 26 мая 2020

У меня есть компонент кнопки React, который отображает его содержимое и передает информацию о стиле / классе кнопке:

<button {...props}>
   {content}
</button>

Это отлично сработало, проблема в том, что я добавил поддержку состояния «загрузка» , для отправки формы et c:

<button {...props}>
   <span style={{ visibility: ${requestStatus === "request" ? "collapse" : "visible"}}>
     {content}
   </span>
   <span className="center-content">
     <LoadingIndicator />
   </span>
</button>

Это отлично работает для кнопок с одним элементом, например:

<MyButton>My Content</MyButton>

Но это ломает любую более сложную кнопку, где я проходя через className или style и хотите стилизовать внутреннее отображение кнопки. Например:

<MyButton className="d-flex align-items-center">
    <MyIcon/>
    <span>My Content</span>
</MyButton>

Flex не применяется к контенту, потому что он заключен в диапазон.

Я подумал попробовать использовать селектор CSS для всех дочерних элементов и переопределите его для индикатора загрузки:

.my-button > * {
  visibility: ${(props) =>
   props.requestStatus === "request" ? "collapse" : "visible"};
}

.my-button .skip {
  visibility: visible;
}

Работает нормально, пока вы не передадите контент, который не заключен в диапазон, например <MyButton>My Content</MyButton>. Я попытался передать это в функцию и проверить typeof content === "string", а затем обернуть его в диапазон. Сработало нормально! За исключением случая:

<MyButton className="d-flex align-items-center">
    <MyIcon/>
    My Content
</MyButton>

Это передано как фрагмент реакции (<><MyIcon/>My Content</>), поэтому проверка строки не выполняется, но второй элемент отображается как строка без элемента в HTML , поэтому селектор css .my-button > * не выбирает его.

Кто-нибудь знает, как я могу надежно выбрать этот текстовый контент? Вот примерный HTML / CSS для состояния загрузки:

  button > * {
    visibility: collapse;
  }

  button .skip {
    visibility: visible;
  }
<button style="display: flex; align-items: center; margin-top: 2rem;">
  <span>Icon</span>
  I want this content to be 'collapsed' in this state
  <span class="skip">Loading...</span>
</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...