alialaa / svelte-course

16 stars 16 forks source link

let:isLeftHovered declared on parent component cannot be used inside named slot #1

Open flyingduck92 opened 10 months ago

flyingduck92 commented 10 months ago

The current version of Svelte not allowed to grab value on parent and used it on named slot, It should be used on the same slot (default/named)

On the tutorial: Button.svelte

  {#if $$slots.leftContent}
    <div
      class="left-content"
      on:mouseenter={() => (isLeftHovered = true)}
      on:mouseleave={() => (isLeftHovered = false)}
      role="none"
    >
      <slot name="leftContent" />
    </div>
  {/if}
  <slot {isLeftHovered}>Fallback Button</slot>

App,svelte

<Button let:isLeftHovered size="small" shadow>
  <div style:width="20px" slot="leftContent">
    {#if isLeftHovered}
      <FaAngellist />
    {:else}
      <FaAngry />
    {/if}
  </div>
  Button Text
</Button>

Should be Button.svelte

{#if $$slots.leftContent}
    <div
      class="left-content"
      on:mouseenter={() => (isLeftHovered = true)}
      on:mouseleave={() => (isLeftHovered = false)}
      role="none"
    >
      <slot name="leftContent" {isLeftHovered} />
    </div>
  {/if}
  <slot>Fallback Button</slot>

App,svelte

<Button size="small" shadow>
  <div let:isLeftHovered style:width="20px" slot="leftContent">
    {#if isLeftHovered}
      <FaAngellist />
    {:else}
      <FaAngry />
    {/if}
  </div>
  Button Text
</Button>
Jan-Eckerlein commented 2 months ago

Please address this dear Svelte Team ;)

naldiocj commented 1 month ago

The solution is: remove let:isLeftHovered in the Button and add to div child

<Button size="small" shadow>
 <div 
  style:width="20px" 
  slot="leftContent" 
  let:isLeftHovered
  >
  {#if isLeftHovered}
    <FaAngellist />
  {:else}
    <FaAllergies />
  {/if}
 </div>
 Button Text
</Button>