lang=pug模板引擎之pug模板语法

今天看到同事的项目

<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>

看的我一脸懵逼,同事让我了解一下这个语法,于是找了一下资料,下面总结一下吧:
解决的痛点

  1. HTML标签必须进行闭合,如果不闭合的话容易报错。
  2. 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>这是安全的:&lt;span&gt;转义!&lt;/span&gt;</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>
  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值