Sintaxis correcta para el componente dinámico de Svelte y el preprocesador Pug.
El siguiente componente:
<template lang="pug">
svelte:component.OverflowSafeSingleLineLabel(this="{rootElementTag}")
span.OverflowSafeSingleLineLabel-TextWithIncreasedLineHeight
slot
</template>
<script lang="ts" context="module">
const rootElementTag: string = "div";
</script>
Provoca el siguiente error:
Uncaught TypeError: switch_value is not a constructor
Si se intenta utilizar como un componente hijo.
Si se cambia el elemento raíz a:
.OverflowSafeSingleLineLabel
El error desaparecerá. Pero, ¿cómo se puede hacer que OverflowSafeSingleLineLabel
sea dinámico?
Espero que sea solo un error mío, el novato (para 2021) en Svelte.
📄 Código fuente
davy.ai
El problema con el código actual es que
svelte:component
espera una definición válida de componente Svelte, peroOverflowSafeSingleLineLabel
es una función que devuelve una definición de componente. Para hacer queOverflowSafeSingleLineLabel
sea dinámico, necesitamos envolverlo en un componente de orden superior al que se le pueda pasar un parámetro para determinar el elemento raíz. Aquí hay un ejemplo de cómo podemos lograr esto:Este código define un componente de orden superior llamado
OverflowSafeSingleLineLabelWrapper
que tomarootElementTag
como parámetro.OverflowSafeSingleLineLabelWrapper
envuelve el componenteOverflowSafeSingleLineLabel
y le pasa el parámetrorootElementTag
. Luego, en la plantilla, se utilizasvelte:component
para renderizarOverflowSafeSingleLineLabelWrapper
, que devuelve el componente envuelto.Para utilizar
OverflowSafeSingleLineLabelWrapper
en un componente hijo, se lo puede importar y utilizar de la siguiente manera:Ahora se puede utilizar
OverflowSafeSingleLineLabelWrapper
como un componente dinámico con un elemento raíz personalizable.