Pular para o conteúdo
SvgJsx
Idioma: Português

Converter SVG em um componente SolidJS

Crie componentes de ícone para SolidJS a partir de código SVG. O resultado segue as convenções de atributos do Solid, tipa as props com JSX.SvgSVGAttributes e continua reativo.

Predefinições:
Solte arquivos .svg aqui ouOs arquivos são lidos localmente com FileReader e nunca são enviados.
Opções
Exportação:
import type { JSX } from "solid-js";

const HeartIcon = (props: JSX.SvgSVGAttributes<SVGSVGElement>) => {
  return (
    <svg width="24" height="24" viewBox="0 0 24 24" class="icon icon-heart" {...props}>
      <g id="Layer_1" fill="none" stroke="#e11d48" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
        <path d="M19.0001 14.0002c1.4900-1.4600 3.0000-3.2100 3.0000-5.5000A5.5000 5.5000 0 0 0 16.5000 3c-1.7600 0-3.0000.5000-4.5000 2-1.5000-1.5000-2.7400-2-4.5000-2A5.5000 5.5000 0 0 0 2 8.5000c0 2.3000 1.5000 4.0500 3 5.5000l7 7Z" style="fill-opacity:0.15;fill:#e11d48" />
      </g>
    </svg>
  );
};

export default HeartIcon;

Pré-visualização

Pré-visualização do SVG convertido
SVG original
706 B
SVG otimizado
538 B(-24%)
Componente
656 B

Como o Solid difere do React

O JSX do Solid aplica os atributos diretamente no DOM, então atributos SVG como stroke-width e class ficam exatamente como aparecem no arquivo. Não é preciso renomeá-los para camelCase ou className como no React.

No Solid, as props são getters reativos, e desestruturá-las quebra a reatividade. Quando você ativa a prop size, o conversor usa splitProps para separar size das demais props e repassa o restante ao <svg>, mantendo todos os valores reativos.

Tipos TypeScript gerados

As props são tipadas como JSX.SvgSVGAttributes<SVGSVGElement>, importado de solid-js, que cobre todos os atributos SVG e manipuladores de evento. Com a opção size, o tipo é estendido com { size?: number | string }.

Usando o componente no SolidStart

Primeiros passos:

  • Salve o resultado como IconName.tsx na sua pasta src/components.
  • Importe e renderize <IconName size={18} class="icon" />.
  • Use currentColor para herdar a cor do texto ao redor.
  • Refs funcionam pela prop ref comum; no Solid não é preciso forwardRef.

Perguntas frequentes

Por que os atributos não viram camelCase no Solid?

O Solid define os atributos diretamente nos elementos do DOM, e no DOM os atributos SVG diferenciam maiúsculas e usam hífens. Manter os nomes originais é a saída mais confiável.

forwardRef e memo se aplicam ao Solid?

Não. Componentes Solid executam uma única vez e recebem refs como props comuns, então essas opções específicas do React são ignoradas quando Solid está selecionado.

O componente continua reativo?

Sim. O conversor nunca desestrutura as props: usa splitProps para a prop size e a lê como local.size, então as atualizações se propagam sem recriar o elemento.

Posso usar o resultado com Astro?

Sim. O Astro suporta componentes Solid pela integração @astrojs/solid-js, e o ícone é renderizado no servidor sem enviar JavaScript, a menos que você o hidrate.