今天看到同事的项目
<template lang="pug">
.d-flex.align-center.line-progress
div(style='width: 30px') {{ name }}
div(style='width: 80%')
el-progress(:stroke-width='10', :percentage='+percent')
</template>
看的我一脸懵逼,同事让我了解一下这个语法,于是找了一下资料,下面总结一下吧:
解决的痛点
- HTML标签必须进行闭合,如果不闭合的话容易报错。
- HTML没有模板机制,如果不使用前端框架维护起来非常困难。
使用
入门指南
在Vue中应用
npm i -D pug pug-plain-loader
入门
<!--pug-->
<template lang="pug">
div.box
div.box1
div.box2
</template>
<!--解析成HTML后-->
<template>
<div class="box">
<div class="box1">
<div class="box2"></div>
</div>
</div>
</template>
从上面的例子可以看出,子组件会比父组件多出缩进,而类的声明不光可以直接通过.xxx的选择器方式声明,也可以向下面一样进行声明。
<template lang="pug">
div(class="box")
div(class="box1")
div(class="box2")
</template>
语法
pug和HTML最大的不同在于它拥有自己的语法,拥有循环、条件控制、定义变量等功能。可以说如果在没有前端框架的年代,这些功能是多么的有诱惑力,但是,近几年React、Vue的出现,已经解决了这些痛点。
条件判断
<template lang="pug">
- let friends = 10 //加上-后不会进行输出
case friends
when 0
p 您没有朋友
when 1
p 您有一个朋友
default
p 您有 #{friends} 个朋友
</template>
<template lang="pug">
- let user = { description: 'foo bar baz' }
- let authorised = false
#user
if user.description
h2.green 描述
p.description= user.description
else if authorised
h2.blue 描述
p.description.
用户没有添加描述。
不写点什么吗……
else
h2.red 描述
p.description 用户没有描述
</template>
<!--解析后-->
<div id="user">
<h2 class="green">描述</h2>
<p class="description">foo bar baz</p>
</div>
上面的例子跟JavaScript的switch和if判断很相似。
循环
<template lang="pug">
div
- for (let x = 0; x < 3; x++)
li item
</template>
<!--解析后-->
<div>
<li>item</li>
<li>item</li>
<li>item</li>
</div>
<template lang="pug">
div
- let list = ["Uno", "Dos", "Tres","Cuatro", "Cinco", "Seis"]
each item in list
li= item
</template>
<!--解析后-->
<template>
<div>
<li>Uno</li>
<li>Dos</li>
<li>Tres</li>
<li>Cuatro</li>
<li>Cinco</li>
<li>Seis</li>
</div>
</template>
可以看到,在pug里面可以使用for循环进行遍历,同时我还发现webstorm的代码格式化在格式化pug代码的时,不能正确的进行缩进,如果对上面的代码进行格式化,代码将无法正常进行解析。
包含/模块化
可以通过include xxx.pug将外部的文件插入进来,当然由于Vue自身已经包含了模块化功能,所以这项功能在Vue中几乎没有用处。
继承与扩展
这一块内容十分类似于Vue中的插槽。即可以使用Vue中的插槽来进行代替,如果真的有兴趣的话,可以直接观看官方文档。
模板继承
嵌入
- var title = "On Dogs: Man's Best Friend";
- var author = "enlore";
- var theGreat = "<span>转义!</span>";
h1= title
p #{author} 笔下源于真情的创作。
p 这是安全的:#{theGreat}
<!--解析后-->
<h1>On Dogs: Man's Best Friend</h1>
<p>enlore 笔下源于真情的创作。</p>
<p>这是安全的:<span>转义!</span></p>
- pug中使用了#{}的方式。
- Vue中使用了{{}}双括号的方式。
- React中使用了{}单括号的方式。
迭代
ul
each val in [1, 2, 3, 4, 5]
li= val
<!--解析后-->
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
混入Mixin
允许您在 Pug 中重复使用一整个代码块的方法,跟JavaScript的函数相类似,并且可以传递一些参数。
mixin pet(name)
li.pet= name
ul
+pet('猫')
+pet('狗')
+pet('猪')
<!--解析后-->
<ul>
<li class="pet">猫</li>
<li class="pet">狗</li>
<li class="pet">猪</li>
</ul>