美文网首页
Jade入门,jade基础语法

Jade入门,jade基础语法

作者: suchcl | 来源:发表于2018-11-01 13:33 被阅读0次

jade模板语法

jade写的网页的demo

doctype html
html(lang="zh-CN")
    head
        meta(charset="UTF-8")
        title jadeTest
    body
        .container
            .header
                .menu
                    .nav
                        li
                            a(href="#") 首页
                        li
                            a(href="#") 新闻中心
            .center
                .row
                    .size1
                        .box.timely-msg
                            .hd
                                h2
                                    a(href="#") 及时消息
                            .bd
                                ul.list
                                    li
                                        a(href="#") 这款合资车售价18万,2.0T+8速动力,比迈腾还有面子,车标成亮点
                    .size2
                        .box.news-list
                            .hd
                                h2
                                    a(href="#") 新闻列表
                            .bd
                                ul.list
                                    li
                                        a(href="#") 这款合资车售价18万,2.0T+8速动力,比迈腾还有面子,车标成亮点
            .footer
                p 公司版权,违者必究

jade的特点

p 不像HTML一样,有<>包围标签,jade中的标签的属性使用紧跟元素后面的小括号()括号括起来,属性值使用引号;

p 另外,jade元素没有相应的开始和结束标记,是通过标记的缩进来表示从属关系,这一点应该是和python的语法类似;

语法

doctype

p HTML文档的开始需要声明文档的类型,具体的声明方式为:

<!DOCTYPE html>

p jade中相应的声明方式为:

doctype html

元素和属性

p HTML中的元素和属性,元素的开始和结束标记,都是通过<>来标识,而在jade中,不需要使用<>标记元素的开始和结束。HTML中的元素属性,需要显示的声明属性的类型,如class、ID,jade中使用#表示id,.来表示class。

#user
    .face
        a(href="#") 修改头像

对应的HTML为:

<div id="user">
    <div class="face"><a href="#">修改头像</a></div>
</div>

如果元素只有一个属性的时候,直接跟在元素后面的()中标明属性名并赋给相应的值就可以了,但如果元素有多个属性,那么元素的属性之间使用逗号(,)分割

#user
    .face
        a(href="#",target="_blank") 修改头像
<div id="user">
    <div class="face"><a href="#" target="_blank">修改头像</a></div>
</div>

元素包含的内容

  1. 元素包含的内容,可以直接将内容跟在元素标签的后面;
.text 全面屏iPad来了!最低售价6499元,果粉们剁手吗
  1. 使用"="来设置元素包含的内容
.text="全面屏iPad来了!最低售价6499元,果粉们剁手吗"

上面2行代码对应的html为:

<div class="text">全面屏iPad来了!最低售价6499元,果粉们剁手吗</div>
<div class="text">全面屏iPad来了!最低售价6499元,果粉们剁手吗</div>

jade中的=

jade中的=后面可以跟任何表达式,这个表达式可以是字符串,可以是变量,也可以是函数,或者是表达式运算的结果。但需要注意,=后面的内容会被转码(escape)

注意:=和前面的元素之间不要有空格,如果出现了空格,=则会被认为是前面元素的内容

=后跟字符串
.text="Hello world!<b>Hello world!</b>"

解释为HTML后为:

<div class="text">Hello world!&lt;b&gt;Hello world!&lt;/b&gt;</div>

=后面的内容会被转码,如果不想后跟的内容被转码,则在=前面加!

.text!="Hello " + "<b>world!</b>"

解释为HTML后的内容为:

<div class="text">Hello <b>world!</b></div>
=后跟变量
ul.list
    -var arr = ['one','two','three'];
    each item in arr
        li= item

这里的=后跟变量,还涉及到了jade的另外一个语法,jade的逻辑语法以及jade内嵌js代码

jade中元素的布尔属性

jade中元素的布尔属性设置为false,则不加入到元素中;如果元素中的布尔属性设置值为true或者不设置值,都会在元素中加入布尔属性

input(placeholder="请输入用户名",disabled)
input(placeholder="请输入密码",disabled=true)
input(placeholder="请确认密码",disabled=false)

解释为HTML后为:

<input placeholder="请输入用户名" disabled>
<input placeholder="请输入密码" disabled>
<input placeholder="请确认密码">

jade中元素添加内联样式

jade中元素添加内联样式,和为元素添加属性的方式基本一致,不同的是内联样式的属性会有多个,这多个属性,可以放到一个{}中,可以简单理解为js中的对象。

.text(style={color:'#f20',padding:'5px 10px'}) Hello World!

解释为HTML后的代码为:

<div style="color:#f20;padding:5px 10px" class="text">Hello World!</div>

jade元素添加内联样式,基本的方式就和上面介绍的一致,但有些特殊的地方,暂时还没有琢磨清楚,就是当属性名有-分隔的时候如font-size,在jade中内联样式中怎么书写,还不知道。

jade自闭合标签

HTML5标准要求自闭合元素不需要闭合标签,即最后的/不需要手动添加,有时为了兼容一些老版本的HTML标准的时候,需要后面的闭合标签,那么可以在自闭合标签后面紧跟一个/即可。

上面是文档介绍的,但我测试了几次,好像都没有实现,这个已经不重要了,现在的HTMl文档的标准是实现HTML5规范,HMTL5标准规范已经不允许使用自闭合标签的结束标签了。

input(placeholder="请输入用户名")/
img(src="../images/img-face.jpg")/

这个测试效果和文档介绍的结果不一致,现在也不那么重要了,解释后的HTML代码也没有添加自闭合的/。

jade中的特殊字符|

|在jade中是一个特殊的字符,它告诉jade模板解析器将后面的内容原样输出,|后面也可以跟HTML元素。

a(href="http://www.baidu.com") 百度
| bc 我查找信息,喜欢百度
| <a href="http://www.google.com">我想查找信息,不喜欢百度,喜欢谷歌</a>

解析为HTML的对应代码为:

<a href="http://www.baidu.com">百度</a>
bc 我查找信息,喜欢百度
<a href="http://www.google.com">我想查找信息,不喜欢百度,喜欢谷歌</a>

比如我们希望得到

<a href="http://www.baidu.com">百度</a>
bc 我查找信息,喜欢百度

这样的结果输出,如果我们直接使用前面提供的语法,

a(href="http://www.baidu.com") 百度
bc 我查找信息,喜欢百度

那么得到的结果将是

<a href="http://www.baidu.com">百度</a>
<bc>我查找信息,喜欢百度</bc>

jade解析器默认回家字母解析为标签,即使bc后面紧跟这后面的文字,jade解析器也会将bc解析为标记。这个时候使用jade的特殊字符|就可以解决这个问题,可以让后面的元素原样输出。
如果没有bc等字母的话,仅仅是文字,那是可以得到预期的结果输出的

<a href="http://www.baidu.com">百度</a>
我查找信息,喜欢百度

#[]语法

如果我想在一段文本中插入一段jade语句,就需要#[]语法了。我们可以将jade语句写在[]中,就可以被jade解释器解释成html语句了

.text Hello,#[span John]

解释后的HTML为:

<div class="text">Hello,<span>John</span></div>

jade中内嵌javascript

jade作为模板引擎,可以在jade代码中嵌入js代码,这里的js代码是作为服务端的代码来执行进行逻辑处理的,而不是常规的html网页中的浏览器的行为。

单行js代码

jade中嵌入单行js代码时,嵌入的js代码需要以“-”开头

ul.list
    -for(var i = 0; i < 3; i++)
        li= i + "我就是个新闻列表"

解释后对应的HTML

<ul class="list">
    <li>0我就是个新闻列表</li>
    <li>1我就是个新闻列表</li>
    <li>2我就是个新闻列表</li>
</ul>

jade中=跟内容的时候,=和前面的元素不要留有空格,如果留空格的话,=就会被当作当前元素的内容来处理了

多行js代码

当在jade中嵌入多行js代码的时候,可以在每行js代码都以“-”开头,也可以让"-"独占一行,然后js代码做缩进书写。

ul.list
    -
        var n = 4;
        for(var j = 1; j < n; j++)
            li= j + "实时消息"

预期的输出HTML应该如下:

<ul class="list">
    <li>1实时消息</li>
    <li>2实时消息</li>
    <li>3实时消息</li>
</ul>

上面的是文档介绍的语法,预期的输出应该是上面的输出,但我实际使用的时候并没有任何的输出,可能是现在的语法有变化,我没有细究。我真正实现嵌套多行js代码,仍旧是每行js代码以"-"开头。

ul.list
    -var n = 4;
    -for(var j = 1; j < n; j++)
        li= j + "实时消息"

实际输出结果值如下:

<ul class="list">
    <li>1实时消息</li>
    <li>2实时消息</li>
    <li>3实时消息</li>
</ul>

jade的逻辑语法

jade自己有一些逻辑的语法,可以与js一起使用,这些jade语句前面不需要使用-开头。和python语法类似。

遍历 each...in

ul.list
    -var university = ['北京大学','清华大学','中国传媒大学'];
    each item in arr
        li= item

这里的=后跟的是变量,变量item

each...in还可以获取到迭代变量的索引

ul.list
    -var city = ['北京','上海','深圳'];
    each item,index in city
        li=index + ": " + item

解释后的对应HTML为:

<ul class="list">
    <li>0: 北京</li>
    <li>1: 上海</li>
    <li>2: 深圳</li>
</ul>

上面的便利对象是数组,each ... in语法遍历数组的时候,可以有2个变量,第一个变量为数组的项,第二个参数为数组的索引。

each...in语法还可以遍历对象。遍历对象的时候,each...in语法也是可以有2个参数,第一个参数为value,第二个参数为key。

ul.list
    -var obj = {"address":"北京","mobile":"13278787878","job":"Teacher"};
    each item,key in obj
        li= key + ":" + item

解释后对应的HTML

<ul class="list">
    <li>address:北京</li>
    <li>mobile:13278787878</li>
    <li>job:Teacher</li>
</ul>

循环 while

这个语法没想好怎么解释,就借用其他编程语言的解释吧,不说了,这里就是一个while...do的操作。

ul.list
    -var num = 1;
    while num < 4
        li= num++

最后一行自增预算,也可以拆开来写,像js一样。

l.list
    -var num = 0;
    while num < 4
        li= num
        -num++

解释后对应的HTML:

<ul class="list">
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>

条件判断

条件判断,jade和其他编程语言的语法基本一致,起码使用的关键词是一致的,都为if。

jade中也可以使用取反操作,如!flag

-var flag = false;
    if(flag)
        .text 有权限
    else if(!flag)
        .text 没有权限
    else
        .text 谁知道有没有权限

case语法

jade中没有了switch,添加了case,这里也仅仅就是改了个名词,改了跟叫发,使用和实现方法是完全一样的。

-var gender = 1;
    case gender
        when 0
            p 男
        when 1
            p 女
        default
            p 保密
<p>女</p>

复用块

jade中可以通过mixin定义复用块,定义方式为:mixin + 复用块的名称,使用方式为:+复用块名称
mixin下面的为复用块的内容,复用块需要先定义后使用。即在定义服用快之前,不能使用,而在定义了复用块以后的代码中,使用位置不限。

mixin showName
    .name Nicholas
+showName
    .text 我是java开发程序员
+showName

可以将复用块简单的理解为函数,可以向复用块中传递参数,使复用块更加具有灵活性

mixin box(cls,title)
    .box(class=cls)
        .hd
            h2=title
        .bd
+box("news","新闻列表")

解释后对应的HTML为:

<div class="box news">
    <div class="hd">
        <h2>新闻列表</h2>
    </div>
    <div class="bd"></div>
</div>

这里的复用块和我们之前的编码习惯基本上吻合了,就是我们要求定义个公用模块,然后有类似结构的都复制一个相同的模块,然后修改一下class和模块的标题,现在解决了手动修改的问题,可以直接引用并给相应的模块赋值相应的class和模块标题。

复用块中引用块

复用块还可以接收一个块(block)参数,这个参数是一组jade语句,这个参数名block是固定的,不能随意更改。在调用的时候,只需要将这组jade语句以缩进的形式写在mixin的下面即可。
复用块引用块情形的定义

mixin mixinName
    jade语句
    block

调用:

+mixinName
    jade语句

demo

//复用块的定义
mixin showUserInfo
    .name Nicholas
    .job Teacher
    block
//复用块调用
+showUserInfo
    .text 他是个好老师,也是个好程序员

解释为HTML后为:

<div class="name">Nicholas</div>
<div class="job">Teacher</div>
<div class="text">他是个好老师,也是个好程序员</div>

如果参数名不使用固定的关键字block,则自定义的参数名会被解释为标记,并且不会起到参数的作用。前面我提到,可以将复用块简单的作为函数来理解,那么block我们就可以理解为形参,复用块调用下面的jade就可以理解为实参。

加入我定义复用块的时候,不添加block参数,那么在调用复用块的下一行的缩进jade语句是不会被解释为HTML的。比如我定义并调用一个复用块:

// 定义复用块
mixin showUserInfo
    .name Nicholas
    .job Teacher

//调用复用块
+showUserInfo
    .text 他是个好老师,也是个好程序员

那么解释为HTML后是不会显示“他是个好老师,也是个好程序员”这一行内容的

<div class="name">Nicholas</div>
<div class="job">Teacher</div>

但如果调用复用块的下一行的jade语句没有缩进书写,那么这一行就不是作为复用块的实参出现的,只是一般的jade语句,可以被正常解释为HTML。

复用块中的attributes属性

前面的介绍,我们了解到复用块可以定义block参数,除了block参数以外,jade还有另外一个隐藏的参数attributes,类似于js中的默认的函数参数对象arguments.这个attributes参数没有想好怎么解释,看例子吧:

mixin showPersonal(name)
    div(title!=attributes.title)=name
+showPersonal("我的姓名")(title="title属性")

解释后的HTML为:

<div title="title属性">我的姓名</div>

attributs参数的作用,请参考复用块showPersonal的调用时的第二个参数(title="title属性")。
再就是需要注意定义复用块时的attributes属性,demo中使用了!=,而不是常规的=,这是因为jade中的=会进行escaped转码,而使用了!=就不会进行转码。

上面的demo是只有一个参数title,那么有多个参数的时候,是也像定义元素的属性一样,定一个属性列表,属性之间使用逗号分隔呢?在不是使用attributes属性的时候,是没有问题的。但是使用attributes属性,灵活性会更高一些。

-var attr = {'data-user':'Nicholas','data-job':'Teacher'}
.text&attributes(attr)
.text(title="title",data-job="student",data-age="18")

.text&attributes(attr)这行代码,可以有缩进,也可以没有缩进,缩进和不缩进实现的效果是完全一样的
demo中的.text&attributes(attr)、.text(title="title",data-job="student",data-age="18")可以说实现的效果完全相同,在属性是固定的时候,但有的时候如果属性不固定,需要根据特定场景赋予不同属性的时候,attributes方式实现的灵活性就能体现出来了

填充数据 #{}、!{}、!=、=

我们已经知道为元素填充数据,可以通过=或者!=来实现,其中=和!=的区别仅仅是后跟的元素数据会不会被escaped转码,=会被转码,!=不会被转码。

.text= "信标请求优先避免与关键操作和更高优先级的网络请求竞争"

然而还有一些情况不适合使用=或者!=.这个时候就得使用#{}语法了,其实#{}和!{}的区别也是会不会被转码的不同。

-var answer = "混合模式开发";
.text 所谓hybrid,顾名思义就是‘#{answer}’

如上面的demo就不适合=,而使用#{}就比较合适。解释后的HTML:

<div class="text">所谓hybrid,顾名思义就是‘混合模式开发’</div>

填充数据的几种方式,使用=和!=的地方都可以使用#{}和!{}替换使用,但是使用#{}和!{}的地方不一定可以使用=和!=替换,简单来说,=和!=一般用于简单场景,#{}和!{}用于相对复杂一点的场景。
无论是使用=和!=还是使用#{}和!{},当填充的数据是字符串的时候,都需要使用引号括起来。如果不加引号,会编译报错。

.text #{'啦啦'}
.text= '哗哗'

对应的HTML

<div class="text">啦啦</div>
<div class="text">哗哗</div>

注释

jade中的注释,和js等其他编程语言基本类似,单行注释使用//作为注释的开始。如果是多行注释,则让//单独占一行,接下来的jade缩进书写。

  1. 使用//注释的jade文件,被解释为HTML后,仍旧会显示注释的内容
  2. 如果不希望在jade中注释的内容显示在HTML中,则可以在使用//-注释
//
    用户信息
    包括用户名、出生日期、性别
.text Nicholas 1987.12.12 男

对应的HTML:

<!--用户信息
包括用户名、出生日期、性别-->
<div class="text">Nicholas 1987.12.12 男</div>
//-
    用户信息
    包括用户名、出生日期、性别
.text Nicholas 1987.12.12 男

对应的HTML:

<div class="text">Nicholas 1987.12.12 男</div>

jade中没有条件注释的方法。HTML中有条件注释的方法,如果有需要在jade中使用的条件注释的地方,直接使用HTML中的注释方法即可。

<!--[if IE 8]>
<html lang="en" class="lt-ie9">
<![endif]-->
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]--> 

继承

jade支持继承,通过关键字extends来实现。

//- layout.jade
doctype html
html(lang="zh-CN")
    head
        block title
        block script
    body
        block content
        block footer
        .footer
            p 版权所属 违者必究
//- son.jade
extends layout.jade
block title
    title 列表页
block script
    script(script='https://lib.baomitu.com/jquery/3.3.1/jquery.js')

block content
    .row
        .size1
            .box
                .hd
                    h2 新闻列表
        .size2

解释的对应HTML为:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>列表页</title>
    <script script="https://lib.baomitu.com/jquery/3.3.1/jquery.js"></script>
</head>
<body>
    <div class="row">
        <div class="size1">
            <div class="box">
                <div class="hd">
                    <h2>新闻列表</h2>
                </div>
            </div>
        </div>
        <div class="size2"></div>
    </div>
    <div class="footer">
        <p>版权所属 违者必究</p>
    </div>
</body>
</html>

相关文章

  • Jade入门,jade基础语法

    jade模板语法 jade写的网页的demo jade的特点 p 不像HTML一样,有<>包围标签,jade中的标...

  • Jade

    Jade ware, even if it is made of natural jade. Jade ware ...

  • ejs与jade的选择

    Jade 因为采用了类似 zen coding 的语法,比较新奇,但效率极其低下。对 Jade,我个人不建议,除了...

  • node知识点

    如何在jade中解析变量 在jade中做运算 jade解析style class 在jade中解析js 在jade...

  • jade操作HTML中的js

    如何在jade中解析变量 js部分 jade部分 在jade中做运算 js部分 jade部分 jade解析styl...

  • jade入门

    jade是node的一个引擎模板,借鉴了html,语法上一些相似,但是还有很大的不同,书写上有很多简便的地方,废话...

  • node4

    const jade=require('jade'); var str=jade.renderFile('./vi...

  • node.js学习(14)——nodejs模板引擎ejs

    上一节-node.js学习(13)—nodejs模板引擎jade(2) 上节我们讲解了jade的基本语法,本节我们...

  • nodeJS压缩代码、jade

    一、jade: 一、终端命令(在存放jade的文件夹下)1、全局安装jade: npm install jade...

  • 2018-12-05 jade

    1jade(模板引擎)使用jade解析字符串下载jade(命令:cnpm install jade/npm ins...

网友评论

      本文标题:Jade入门,jade基础语法

      本文链接:https://www.haomeiwen.com/subject/psfxxqtx.html