【问题标题】:How to set a class name dependant on another attribute of the same element in Svelte?如何在 Svelte 中设置依赖于同一元素的另一个属性的类名?
【发布时间】:2021-11-28 17:52:55
【问题描述】:

我想根据同一元素的属性设置一个条件类,这样我就可以保持干爽。起初我得到了这个:

  <div class="hidden md:flex items-center space-x-3">
    <a href="#Index" class="navBarLink {currentPageName == 'Index' ? 'activeLink' : ''}">Farm</a>
    <a href="#/Leaderboard" class="navBarLink {currentPageName == 'Leaderboard' ? 'activeLink' : ''}">LeaderBoard</a>
    <a href="#/WafBox" class="navBarLink {currentPageName == 'WafBox' ? 'activeLink' : ''}">WafBox</a>
    <a href="#/Buy" class="navBarLink {currentPageName == 'Buy' ? 'activeLink' : ''}">Buy</a>
    <a href="#/Info" class="navBarLink {currentPageName == 'Info' ? 'activeLink' : ''}">Info</a>
</div>

现在我想要这个:

  <div class="hidden md:flex items-center space-x-3">
    <a href="#Index" class="navBarLink {isActive(this)}">Farm</a>
    <a href="#/Leaderboard" class="navBarLink {isActive(this)}">LeaderBoard</a>
    <a href="#/WafBox" class="navBarLink {isActive(this)}">WafBox</a>
    <a href="#/Buy" class="navBarLink {isActive(this)}">Buy</a>
    <a href="#/Info" class="navBarLink {isActive(this)}">Info</a>
  </div>

然后我只需要在我的函数isActive 中检查href 的属性。但是这里this 里面似乎没有正确的信息。有没有办法做到这一点?它会清理我的代码很多

编辑:isActive() 看起来像这样:

<script>
  function isActive(element) {
    return 'Active' if (currentPageName == element.attr('href'))
  }
</script>

【问题讨论】:

  • isActive() 函数长什么样?是只检查currentPageName == 'Leaderboard'吗?
  • 确实看起来像这样 `function isActive(element) { return 'Active' if (currentPageName == element.attr('href')) }` 刚刚更新了我的问题 :)

标签: javascript html css svelte


【解决方案1】:

你的方法的一个问题是两者都在

<a href="#/Leaderboard" class="navBarLink {isActive(this)}">LeaderBoard</a>

以及使用 class:directive 提出的答案

 <a href="#Index" class:active-link={isActive('Index')}>Index</a>

是该函数只会在第一次渲染时运行一次,然后永远不会重新执行,即使currentPageName 更改时也不会。

最明显、最直接的解决方案是简单地放弃函数调用并像这样使用 class:directive:

<a href="#Index" class:active-link={currentPageName == 'Index'}>Index</a>   

这将确保类随着 currentPageName 的变化而变化。

【讨论】:

    【解决方案2】:

    当使用箭头语法声明函数并通过添加$: 使其具有反应性时,看起来就像使用class:directive(检查值是否为真/假)的替代方法,类名可以直接设置在@987654324 中@ 属性也是如此

    一个REPL

    <script>
        let currentPageName = 'Index'
    
        $: isActive = (linkText) => {
            if (linkText === currentPageName) return 'active-link'
            // else if (...) return 'other-class-name' // possible class name switch
            else return ''
        }  
    </script>
    
      <div class="">
        <a href="#Index" class="{isActive('Index')}">Index</a>   
      </div>
      <div class="">
        <a href="#Leaderboard" class="{isActive('Leaderboard')}">Leaderboard</a>   
      </div>
    
    <br>
    <button on:click={() => currentPageName = 'Leaderboard'}>change currentPageName</button>
    
    <style>
        .active-link {
            color: purple;
        }
    </style>
    

    【讨论】:

    • 我尝试了您的解决方案,但不幸的是,我必须初始化尽可能多的变量,并且我需要每行重复三倍元素名称的名称。不过谢谢你的回答!
    • 实际上它可能是正确的答案,因为我们可以通过绑定访问元素!我会接受另一个,因为这是我将使用的那个:)
    • @sidney sure :) 我同意另一个答案,它是最直接的解决方案,因此可能是最好的......您不需要该元素,因此绑定绝对是不必要的。我将答案更改为您尝试实现的另一种方法,这会带来之前缺少的反应性,并且如果应该插入不同的类名可能会派上用场
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2021-04-02
    • 2020-10-19
    • 1970-01-01
    • 2012-08-28
    • 2022-11-30
    相关资源
    最近更新 更多