![58ec618aac11c43ffac2ee7f752107c8.png](https://i-blog.csdnimg.cn/blog_migrate/d26ce0e40ff294f85cdcfcacbeb8ae5c.png)
本文同步发表在我的个人博客中:
沧沧凉凉www.cclliang.com之前学习WePY
的时候看到官方给出的demo:
![a0430b9533b28dc77ae0e7087f2e8786.png](https://i-blog.csdnimg.cn/blog_migrate/8d524e47bce3031385a7f48560647dd6.png)
就觉得这个HTML
模板引擎有点酷,虽然我不太喜欢这种使用缩进来代替闭合标签或者{}
的方式,但还是觉得可以尝试着了解一下pug的语法。
解决的痛点
- HTML标签必须进行闭合,如果不闭合的话容易报错。
- HTML没有模板机制,如果不使用前端框架维护起来非常困难。
使用
入门指南 - Pugpugjs.org在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中的插槽来进行代替,如果真的有兴趣的话,可以直接观看官方文档。
模板继承 Inheritancepugjs.org嵌入
- 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>
结论
![d545ee4b01958556a3c355dc51cd8dc0.png](https://i-blog.csdnimg.cn/blog_migrate/1050727396528d242928551b7c8b62fb.jpeg)
就我个人而言,我是非常不喜欢这种没有闭合标签的语句,可能是因为我学的第一门编程语言是C#
的关系,所以我还是比较喜欢拥有{}
的编程语言。
在webstorm中,对pug语法的代码提示做的远远不如HTML,并且pug的大部分功能在现在的Vue,React框架中也有对应的实现方法,总之我感觉了解一下pug就可以了,如果遇到真的有工程使用,到时候再进行针对性学习也不迟。