Nodejs中jade模板的if该怎么写
Nodejs中jade模板的if该怎么写
-if(tag.selected)
li.active
-else
li
a
想得到<li class=“active”><a /></li>
, 实际结果是<li class=“active”></li><a />
我知道换种写法
-if(tag.selected)
li.active
a
-else
li
a
但这样jade的if语法也太弱了,只是为了给父元素加个class就要把子元素写两遍, 是不是有别的写法?
在Node.js中使用Jade(现在更名为Pug)模板引擎时,处理条件语句确实需要一些技巧。你提到的问题是因为if
语句只影响其直接后续的行,而不会影响到更深层级的结构。为了解决这个问题,你可以考虑使用嵌套的块来实现你的需求。
以下是改进后的示例代码:
ul
if tag.selected
li.active
a(href="#") 点击我
else
li
a(href="#") 点击我
这段代码将生成以下HTML:
<ul>
<li class="active">
<a href="#">点击我</a>
</li>
</ul>
<!-- 或者 -->
<ul>
<li>
<a href="#">点击我</a>
</li>
</ul>
如果你希望减少重复代码,可以使用嵌套的方式来简化结构:
ul
if tag.selected
li.active
else
li
a(href="#") 点击我
但是,这种方式可能无法达到预期效果,因为a
标签会被放置在li
标签之外。
为了更优雅地解决这个问题,你可以考虑使用JavaScript表达式来动态生成类名:
ul
li(class=`${tag.selected ? 'active' : ''}`)
a(href="#") 点击我
这段代码会根据tag.selected
的值动态添加或省略active
类名。
总结一下,虽然Jade的if
语句本身比较简洁,但在处理复杂的条件逻辑时,可能需要结合其他方法来实现更灵活的效果。通过上述方法,你可以更好地控制生成的HTML结构,并保持代码的清晰度。
- var class="" -if(tag.selected) var class=“active”
li(class="#{class}") a
这样解决吧。。我反正也没找到更好的办法。都是先写一堆js在上面,然后下面填空。。
哈哈,jade这方面果然挫
一个小错误,a不是单闭合的标签,必须双闭合
你提到的情况是因为 Jade(现在称为 Pug)模板引擎对缩进非常敏感。你的问题在于 if 语句内部的子元素应该正确地嵌套在 if 或 else 块中。
这里有一个简单的示例来展示如何正确使用 if 语句,并且只在条件满足时添加 class
属性:
ul
- if (tag.selected)
li.active
a(href='/') Link Text
- else
li
a(href='/') Link Text
在这个例子中:
- 如果
tag.selected
为真,则会渲染<li class="active">
。 - 否则,只会渲染
<li>
。 - 在这两种情况下,
a
标签都会被包含在li
中。
如果你希望避免重复书写 a
标签,可以考虑将 a
标签的渲染逻辑提取出来,或者通过 JavaScript 动态生成类名。但是基于当前的 Pug 模板语法,上述方法是最直接和简洁的方式。
如果你有更复杂的条件逻辑,可以考虑使用 mixin 或者将某些部分封装成可重用的组件。这样即使结构变得复杂,也可以保持代码的清晰和可维护性。