Tim*_*son 4 javascript switch-statement svelte sveltekit
我想使用switch caseSvelte 中的语句有条件地渲染组件,如下所示:
// index.svelte
<script>
import TextContent from './components/text-content.svelte'
import { someData } from './api/some-data.js'
const ContentSwitch = (data) => {
switch (data._type) {
case 'block':
return data.children.map((child) => ContentSwitch(child));
case 'span':
return (
<TextContent>
<span slot="text-content">{data.text}</span>
</TextContent>
);
}
for (let index = 0; index < data.length; index++) {
return data.map((item) => ContentSwitch(item));
}
};
</script>
<div>
{#each someData as data}
{ContentSwitch(data)}
{/each}
</div>
Run Code Online (Sandbox Code Playgroud)
文本内容组件:
// components/text-content.svelte
<slot name="text-content">
<span />
</slot>
Run Code Online (Sandbox Code Playgroud)
看来这种方法在 Svelte 中不起作用,因为我收到了错误Unexpected Token。
Svelte 中可以使用开关渲染组件吗?
你在那里写的内容类似于更多用于 React 的 JSX。在 Svelte 中,您不在 JavaScript 中编写 HTML,而是将它们分开。
您要做的就是创建一个查找表并使用 svelte:component 来渲染正确的组件:
<script>
const BlockTypes = {
"span": TextContent
}
</script>
{#each children as child}
{#if child.type === 'block'}
<svelte:self {...child} />
{:else}
<svelte:component this={BlockTypes[child.type]} {...child} />
{/if}
{/each}
Run Code Online (Sandbox Code Playgroud)
svelte:self假设它本身也是块类型的元素,由于您无法将组件导入到其自身中,因此这里需要这种特殊情况。有了这个,您就可以开箱即用地嵌套块。
在此示例中,您将子级的所有属性传递给渲染的组件,因此您必须稍微重写组件,您也可以使用插槽,但这对于命名插槽来说会是一个严重的混乱。
| 归档时间: |
|
| 查看次数: |
9804 次 |
| 最近记录: |