7

我正在if根据Svelte Guide 为 if 块制作一个块。看起来很简单,但 Svelte 认为这是一个语法错误:

[!] (svelte plugin) ParseError: Unexpected character '#'
public\js\templates\works.html
3:     <div class="slides js_slides">
4:       {#each works as work, index}
5:         <div class="js_slide {#if index === currentIndex }selected{/if} {#if index === 0 }first{/if}">
                                ^
6:           <img src="/images/work/screenshots/{ works[index].slug }-0.{ works[index].imageExtension }"/>
7:         </div>

为什么不{#if index === currentIndex }被认为是有效的?如何在 Svelte 中执行条件语句?

我不能为每个可能的结果class=创建单独的块,但这是大量的工作。

4

3 回答 3

18

块({#if...{#each...)不能在属性内部使用——它们只能定义标记的结构。

相反,约定是使用三元表达式...

<div class="
  js_slide
  {index === currentIndex ? 'selected' : ''}
  {index === 0 ? 'first' : ''}
">
  <img src="/images/work/screenshots/{ works[index].slug }-0.{ works[index].imageExtension }"/>
</div>

...或使用助手:

<!-- language: lang-html -->

<div class="js_slide {getClass(work, index, currentIndex)}">
  <img src="/images/work/screenshots/{ works[index].slug }-0.{ works[index].imageExtension }"/>
</div>

有些人喜欢做一些事情,比如data-selected={index === currentIndex}and data=first={index === 0},以及基于[data-selected=true]选择器的样式。

于 2018-07-18T18:01:26.050 回答
10

从 Svelte 2.13 开始你也可以

<div class:selected={index === currentIndex}>...</div>

https://svelte.dev/docs#class_name

于 2019-09-13T19:23:43.097 回答
1

https://svelte.dev/docs#class_name中所述,如果在类中其他 ,则需要额外的 JS 变量才能操作

这是一个示例,其中每个循环从a迭代到b如果true ,则将应用 css

{#each Array.from(Array(b+1).keys()).slice(a) as i }

    <div class="{ i===4 ? "border-l-2 border-blue-500" : ""}  p-3 space-y-4">
     some sample text
    </div>
{/each}

示例(1 到 15):

{#each Array.from(Array(15+1).keys()).slice(1) as i }

    <div class="{ i===3 ? "border-l-2 border-blue-500" : ""}  p-3 space-y-4">
     some sample text
    </div>
{/each}
于 2021-12-19T07:44:47.943 回答