Skip to content

SolidJS

@ecss/solid-adapter генерирует типизированные компоненты SolidJS из объявлений @block и @element. id адаптера — 'solid'.

В отличие от React/Vue-адаптеров, Solid-адаптер module-based: он генерирует настоящие .jsx-файлы в каталог .ecss/solid/, потому что JSX компилируется через vite-plugin-solid (только .jsx/.tsx). Импорт ./X.ecss перенаправляется на них автоматически — для вас это прозрачно.

Установка

sh
npm i -D @ecss/solid-adapter
sh
pnpm add -D @ecss/solid-adapter
sh
yarn add -D @ecss/solid-adapter

Требуется установленный solid-js версии 1.8 или выше.

Подключение

Адаптер регистрируется в ecss.config.ts через defineConfig из @ecss/config — конфиг не привязан к конкретному сборщику, его читает ECSS-плагин вашего бандлера. defaultAdapter задаёт адаптер, применяемый к .ecss-файлам по умолчанию:

ts
// ecss.config.ts
import { defineConfig } from '@ecss/config';
import { solidAdapter } from '@ecss/solid-adapter';

export default defineConfig({
  adapters: [solidAdapter()],
  defaultAdapter: 'solid',
});

Использование

Каждый @block превращается в компонент SolidJS, который импортируется напрямую из .ecss-файла. Имя компонента формируется как {префикс}{BlockName} (по умолчанию префикс E): @block ButtonEButton.

tsx
import { EButton } from './Button.ecss';

function App() {
  return (
    <EButton as="button" params={{ variant: 'primary' }}>
      Нажми меня
    </EButton>
  );
}

Проп params

Параметры блока передаются единственным пропом params. Их типы берутся из сгенерированного интерфейса {Block}Params (например ButtonParams), поэтому передать несуществующее значение @enum не получится.

params обязателен, если у блока есть хотя бы один обязательный @param (без ?); если все параметры опциональны или их нет вовсе — проп можно опустить.

tsx
<EButton params={{ variant: 'primary' }} /> {/* variant обязателен */}
<ECard /> {/* у Card все параметры опциональны */}

Проп as

По умолчанию компонент рендерится как <div>. Проп as принимает любой HTML-тег и меняет корневой элемент. Компонент типизирован по выбранному тегу, поэтому набор допустимых HTML-атрибутов сужается автоматически:

tsx
<EButton as="button" type="submit" params={{ variant: 'primary' }}>Отправить</EButton>

<EButton as="a" href="/about" params={{ variant: 'ghost' }}>Ссылка</EButton>

При as="a" доступны href, target и прочие атрибуты <a>; при as="button"type, disabled и т.д.

class, style и атрибуты

ECSS задаёт корневому элементу класс блока, CSS-переменные из params и data-атрибуты. То, что передаёт потребитель, объединяется с этими значениями:

  • class — потребительский класс добавляется к классу блока (Solid использует class, а не className);
  • style — мёрджится поверх CSS-переменных из params; потребитель может передать как объект JSX.CSSProperties, так и строку CSS — поддерживаются оба варианта;
  • остальные атрибуты и обработчики (onClick, aria-*, data-*, …) прокидываются на корневой элемент и выигрывают при коллизии с data-атрибутами.

Компонент реактивен: блок пересчитывается при изменении params.

Суб-компоненты (@element)

Если @block содержит @element, они становятся вложенными компонентами через статические свойства корневого:

tsx
import { EButton } from './Button.ecss';

<EButton params={{ withIcon: true }}>
  <EButton.Icon>
    <svg>{/* … */}</svg>
  </EButton.Icon>
  <EButton.Text>Нажми меня</EButton.Text>
</EButton>;

Суб-компоненты поддерживают тот же проп as (по умолчанию <div>), но не принимают params.

Опции

Единственная опция фабрики — componentNamePrefix (префикс имени компонента, по умолчанию 'E'): solidAdapter({ componentNamePrefix: 'My' })MyButton. Подробнее — в обзоре адаптеров.

Требования

Требуется SolidJS (solid-js) версии 1.8 или выше.

Сгенерированные компоненты — обычный JSX (без TypeScript внутри), а типы подключаются автоматически, поэтому адаптер одинаково работает и в JS-, и в TS-проектах.

См. также